{"id":13466722,"url":"https://github.com/amuste/DnetIndexedDb","last_synced_at":"2025-03-26T00:31:27.045Z","repository":{"id":37763641,"uuid":"253788818","full_name":"amuste/DnetIndexedDb","owner":"amuste","description":"Blazor Library for IndexedDB DOM API","archived":false,"fork":false,"pushed_at":"2022-09-16T00:49:59.000Z","size":3041,"stargazers_count":108,"open_issues_count":10,"forks_count":29,"subscribers_count":11,"default_branch":"master","last_synced_at":"2025-03-03T13:40:17.924Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/amuste.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-04-07T12:39:15.000Z","updated_at":"2025-02-12T04:57:16.000Z","dependencies_parsed_at":"2023-01-17T17:15:51.219Z","dependency_job_id":null,"html_url":"https://github.com/amuste/DnetIndexedDb","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amuste%2FDnetIndexedDb","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amuste%2FDnetIndexedDb/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amuste%2FDnetIndexedDb/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amuste%2FDnetIndexedDb/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/amuste","download_url":"https://codeload.github.com/amuste/DnetIndexedDb/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245566098,"owners_count":20636390,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-07-31T15:00:49.299Z","updated_at":"2025-03-26T00:31:25.532Z","avatar_url":"https://github.com/amuste.png","language":"JavaScript","funding_links":[],"categories":["Libraries \u0026 Extensions"],"sub_categories":["Tools \u0026 Utilities"],"readme":"master - .Net5 version\n\nmaster_net31 - 3.x version\n\n# DnetIndexedDb\nThis is a Blazor library to work with IndexedDB DOM API. It allows query multiple IndexedDb databases simultaneously \n\nThe actual API expose the following methods:\n\n* Open and upgrade an instance of IndexedDB\n* Close an instance of IndexedDB\n* Delete an instance of IndexedDB\n* Add an item to a given store\n* Update an item in a given store\n* Delete an item from a store by key\n* Delete all items from a store\n* Retrieve all items from a given store\n* Retrieve an items by index\n* Retrieve a range of items by key\n* Retrieve a range of items by index\n* Retrieve max key value\n* Retrieve max index value\n* Retrieve minimum key value\n* Retrieve minimum index value\n\nCompatibility\n*Server-side Blazor and client-side Blazor\n\n## Using the library\n\n### Installation\n\n1. Install the Nuget package DnetIndexedDb\n2. Add the following script reference to your Index.html after the blazor.webassembly.js or blazor.server.js reference: \n\n```Html\n\u003cscript src=\"_content/DnetIndexedDb/rxjs.min.js\"\u003e\u003c/script\u003e\n\u003cscript src=\"_content/DnetIndexedDb/dnet-indexeddb.js\"\u003e\u003c/script\u003e\n```\n\n3. Create a derived class from ```IndexedDbInterop```.  \n   a. This is the class you will use to interact with IndexedDb JavaScript for this database\n\n```CSharp\n  public class GridColumnDataIndexedDb : IndexedDbInterop\n  {\n    public GridColumnDataIndexedDb(IJSRuntime jsRuntime, IndexedDbOptions\u003cGridColumnDataIndexedDb\u003e options) \n    :base(jsRuntime, options)\n    {\n    }\n  }\n```\n\n5. Create a new instance of ```IndexedDbDatabaseModel```.  \nConfigure this using one of the options in the next section.\n4. Register your derived class in ```ConfiguredServices``` in ```Startup.cs```.  \nWhen registering, use options to add the `IndexedDbDatabaseModel` instance.\n\n```CSharp\n  services.AddIndexedDbDatabase\u003cGridColumnDataIndexedDb\u003e(options =\u003e\n  {\n    options.UseDatabase(GetGridColumnDatabaseModel());\n  });\n```\n\n6. Inject the created instance of your derived class into the component or page.\n\n\n### Detailed configuration and use\n\n#### Step 1 - Create the database model\nTo configure the database model, use the following classes. You can find more info about the IndexedDB database here: https://www.w3.org/TR/IndexedDB-2/#database-construct\n\n```IndexedDbDatabaseModel``` \n```IndexedDbStore```\n```IndexedDbIndex``` \n```IndexedDbStoreParameter``` \n\n```CSharp\n    public class IndexedDbDatabaseModel\n    {      \n        public string Name { get; set; }     \n        public int Version { get; set; }      \n        public List\u003cIndexedDbStore\u003e Stores { get; set; } = new List\u003cIndexedDbStore\u003e();\n        public int DbModelId { get; set; }\n    }\n```\n\n##### Manual Configuration\n\n```CSharp\n var indexedDbDatabaseModel = new IndexedDbDatabaseModel\n            {\n                Name = \"GridColumnData\",\n                Version = 1,\n                Stores = new List\u003cIndexedDbStore\u003e\n                {\n                new IndexedDbStore\n                {\n                    Name = \"tableField\",\n                    Key = new IndexedDbStoreParameter\n                    {\n                        KeyPath = \"tableFieldId\",\n                        AutoIncrement = true\n                    },\n                    Indexes = new List\u003cIndexedDbIndex\u003e\n                    {\n                        new IndexedDbIndex\n                        {\n                            Name = \"tableFieldId\",\n                            Definition = new IndexedDbIndexParameter\n                            {\n                                Unique = true\n                            }\n                        },\n                        new IndexedDbIndex\n                        {\n                            Name = \"attachedProperty\",\n                            Definition = new IndexedDbIndexParameter\n                            {\n                                Unique = false\n                            }\n                        },\n                        new IndexedDbIndex\n                        {\n                            Name = \"fieldVisualName\",\n                            Definition = new IndexedDbIndexParameter\n                            {\n                                Unique = false\n                            }\n                        }, new IndexedDbIndex\n                        {\n                            Name = \"hide\",\n                            Definition = new IndexedDbIndexParameter\n                            {\n                                Unique = false\n                            }\n                        },\n                        new IndexedDbIndex\n                        {\n                            Name = \"isLink\",\n                            Definition = new IndexedDbIndexParameter\n                            {\n                                Unique = false\n                            }\n                        },\n                        new IndexedDbIndex\n                        {\n                            Name = \"memberOf\",\n                            Definition = new IndexedDbIndexParameter\n                            {\n                                Unique = false\n                            }\n                        },\n                        new IndexedDbIndex\n                        {\n                            Name = \"tableName\",\n                            Definition = new IndexedDbIndexParameter\n                            {\n                                Unique = false\n                            }\n                        },\n                        new IndexedDbIndex\n                        {\n                            Name = \"textAlignClass\",\n                            Definition = new IndexedDbIndexParameter\n                            {\n                                Unique = false\n                            }\n                        },\n                        new IndexedDbIndex\n                        {\n                            Name = \"type\",\n                            Definition = new IndexedDbIndexParameter\n                            {\n                                Unique = false\n                            }\n                        },\n                        new IndexedDbIndex\n                        {\n                            Name = \"width\",\n                            Definition = new IndexedDbIndexParameter\n                            {\n                                Unique = false\n                            }\n                        }\n                    }\n                }\n            },\n                DbModelId = 0\n            };\n```\n\n##### Fluent Manual Configuration\n\nFluent-based Extension methods to make the configuration of the database simplier.\nIt will create the same model as manual configuration but in a more concise syntax.\n\n```CSharp\nusing DnetIndexedDb.Fluent;\n...\n    services.AddIndexedDbDatabase\u003cSecuritySuiteDataIndexedDb\u003e(options =\u003e\n    {\n        var model = new IndexedDbDatabaseModel()\n            .WithName(\"Security\")\n            .WithVersion(1)\n            .WithModelId(0);\n\n        model.AddStore(\"tableFieldDtos\")\n            .WithAutoIncrementingKey(\"tableFieldId\")\n            .AddUniqueIndex(\"tableFieldId\")\n            .AddIndex(\"attachedProperty\")\n            .AddIndex(\"fieldVisualName\")\n            .AddIndex(\"hide\")\n            .AddIndex(\"isLink\")\n            .AddIndex(\"memberOf\")\n            .AddIndex(\"tableName\")\n            .AddIndex(\"textAlignClass\")\n            .AddIndex(\"type\")\n            .AddIndex(\"width\");\n\n        options.UseDatabase(model);\n    });\n```\n\n##### Configure From Class Attributes by @Kylar182\n\n`[IndexDbKey]` and `[IndexDbIndex]` Property Attributes can be used to configure the database based on the given class.  \nA DataStore will be created matching the name of the class.\n\n```CSharp\n    public class TableFieldDto\n    {\n        [IndexDbKey(AutoIncrement = true)]\n        public int? TableFieldId { get; set; }\n        [IndexDbIndex]\n        public string TableName { get; set; }\n        [IndexDbIndex]\n        public string FieldVisualName { get; set; }\n        [IndexDbIndex]\n        public string AttachedProperty { get; set; }\n        [IndexDbIndex]\n        public bool IsLink { get; set; }\n        [IndexDbIndex]\n        public int MemberOf { get; set; }\n        [IndexDbIndex]\n        public int Width { get; set; }\n        [IndexDbIndex]\n        public string TextAlignClass { get; set; }\n        [IndexDbIndex]\n        public bool Hide { get; set; }\n        [IndexDbIndex]\n        public string Type { get; set; }\n    }\n\n...\n\n    var indexedDbDatabaseModel = new IndexedDbDatabaseModel()\n        .WithName(\"TestAttributes\")\n        .WithVersion(1);\n\n    indexedDbDatabaseModel.AddStore\u003cTableFieldDto\u003e();\n```\n\n#### Step 2 - Creating a service\nYou can create a service for any indexedDB's database that you want to use in your application. Use the base class ```IndexedDbInterop``` to create your derived class. See code below.\n\n```CSharp\n  public class GridColumnDataIndexedDb : IndexedDbInterop\n  {\n    public GridColumnDataIndexedDb(IJSRuntime jsRuntime, IndexedDbOptions\u003cGridColumnDataIndexedDb\u003e options) \n    :base(jsRuntime, options)\n    {\n    }\n  }\n```\n\nThis follows a similar pattern to what you do when you create a new DbContext in EF core. \n\n#### Step 3 - Registering a service\nYou can use the ```AddIndexedDbDatabase``` extension method to register your service in ```ConfiguredServices``` on ```Startup.cs```. Use the ```options``` builder to add the service Database. See code below.\n\n```CSharp\n  services.AddIndexedDbDatabase\u003cGridColumnDataIndexedDb\u003e(options =\u003e\n  {\n    options.UseDatabase(GetGridColumnDatabaseModel());\n  });\n```\n\n```GetGridColumnDatabaseModel()``` return an instance of ```IndexedDbDatabaseModel```\n\nYou can also use multiple database, declaring as many service as you want.\n```CSharp\n   services.AddIndexedDbDatabase\u003cSecuritySuiteDataIndexedDb\u003e(options =\u003e\n   {\n     options.UseDatabase(GetSecurityDatabaseModel());\n   });\n```\n\n## Using the service in your application\n\nTo use IndexedDB service in a component or page first inject the IndexedDB servicer instance.\n\n```CSharp\n@inject GridColumnDataIndexedDb GridColumnDataIndexedDb\n``` \n\nIndexedDB store are the equivalent of table in SQL Database. For the API demostrations will use the following class as our store model.\n\n```CSharp\n    public class TableFieldDto\n    {\n        public int TableFieldId { get; set; }\n        public string TableName { get; set; }\n        public string FieldVisualName { get; set; }\n        public string AttachedProperty { get; set; }\n        public bool IsLink { get; set; }\n        public int MemberOf { get; set; }\n        public int Width { get; set; }\n        public string TextAlignClass { get; set; }\n        public bool Hide { get; set; }\n        public string Type { get; set; }\n    }\n```\n\n\n## API examples\n\nThe following examples have two overloads of each DataStore level function.\n\nThe first is used when you need to manually specify the DataStore name and the store name does not match the Class Name.\n\nThe second is used when the Class name and DataStore name match, such as when using the Class Attribute based configuration.\n\n### Open and upgrade an instance of IndexedDB\n\n```ValueTask\u003cint\u003e OpenIndexedDb()```\n\n```CSharp\n var result = await GridColumnDataIndexedDb.OpenIndexedDb();\n```\n \n### Add an items to a given store\n\n```ValueTask\u003cTEntity\u003e AddItems\u003cTEntity\u003e(string objectStoreName, List\u003cTEntity\u003e items)```\n\n```ValueTask\u003cTEntity\u003e AddItems\u003cTEntity\u003e(List\u003cTEntity\u003e items)```\n\n```CSharp\n// Manually set DataStore name\n var result = await GridColumnDataIndexedDb.AddItems\u003cTableFieldDto\u003e(\"tableField\", items);\nOR\n// DataStore name inferred from class \n var result = await GridColumnDataIndexedDb.AddItems\u003cTableFieldDto\u003e(items);\n```\n\n### Retrieve an item by key\n\n```ValueTask\u003cTEntity\u003e GetByKey\u003cTKey, TEntity\u003e(string objectStoreName, TKey key)```\n\n```ValueTask\u003cTEntity\u003e GetByKey\u003cTKey, TEntity\u003e(TKey key)```\n\n```CSharp\n// Manually set DataStore name\n var result = await GridColumnDataIndexedDb.GetByKey\u003cint, TableFieldDto\u003e(\"tableField\", 11);\nOR\n// DataStore name inferred from class \n var result = await GridColumnDataIndexedDb.GetByKey\u003cint, TableFieldDto\u003e(11);\n```\n\n### Delete an item from a store by key\n\n```ValueTask\u003cstring\u003e DeleteByKey\u003cTKey\u003e(string objectStoreName, TKey key)```\n\n```ValueTask\u003cstring\u003e DeleteByKey\u003cTKey, TEntity\u003e(TKey key)```\n\n```CSharp\n// Manually set DataStore name\n var result = await GridColumnDataIndexedDb.DeleteByKey\u003cint\u003e(\"tableField\", 11);\nOR\n// DataStore name inferred from class \n var result = await GridColumnDataIndexedDb.DeleteByKey\u003cint, TableFieldDto\u003e(11);\n```\n\n### Retrieve all items from a given store\n\n```ValueTask\u003cList\u003cTEntity\u003e\u003e GetAll\u003cTEntity\u003e(string objectStoreName)```\n\n```ValueTask\u003cList\u003cTEntity\u003e\u003e GetAll\u003cTEntity\u003e()```\n\n```CSharp\n// Manually set DataStore name\n  var result = await GridColumnDataIndexedDb.GetAll\u003cTableFieldDto\u003e(\"tableField\");\nOR\n// DataStore name inferred from class \n  var result = await GridColumnDataIndexedDb.GetAll\u003cTableFieldDto\u003e();\n```\n\n### Retrieve a range of items by key\n\n```ValueTask\u003cList\u003cTEntity\u003e\u003e GetRange\u003cTKey, TEntity\u003e(string objectStoreName, TKey lowerBound, TKey upperBound)```\n\n```ValueTask\u003cList\u003cTEntity\u003e\u003e GetRange\u003cTKey, TEntity\u003e(TKey lowerBound, TKey upperBound)```\n\n```CSharp\n// Manually set DataStore name\n   var result = await GridColumnDataIndexedDb.GetRange\u003cint, TableFieldDto\u003e(\"tableField\", 15, 20);\nOR\n// DataStore name inferred from class \n   var result = await GridColumnDataIndexedDb.GetRange\u003cint, TableFieldDto\u003e(15, 20);\n```\n\n### Retrieve a range of items by index\n\n```ValueTask\u003cList\u003cTEntity\u003e\u003e GetByIndex\u003cTKey, TEntity\u003e(string objectStoreName, TKey lowerBound, TKey upperBound, string dbIndex, bool isRange)```\n\n```ValueTask\u003cList\u003cTEntity\u003e\u003e GetByIndex\u003cTKey, TEntity\u003e(TKey lowerBound, TKey upperBound, string dbIndex, bool isRange)```\n\n```CSharp\n// Manually set DataStore name\n    var result = await GridColumnDataIndexedDb.GetByIndex\u003cstring, TableFieldDto\u003e(\"tableField\", \"Name\", null, \"fieldVisualName\", false);\nOR\n// DataStore name inferred from class \n    var result = await GridColumnDataIndexedDb.GetByIndex\u003cstring, TableFieldDto\u003e(\"Name\", null, \"fieldVisualName\", false);\n```\n\n### Retrieve Max Key\n\n```ValueTask\u003cTKey\u003e GetMaxKey\u003cTKey\u003e(string objectStoreName)```\n\n```ValueTask\u003cTKey\u003e GetMaxKey\u003cTKey, TEntity\u003e()```\n\n```CSharp\n// Manually set DataStore name\n    var result = await GridColumnDataIndexedDb.GetMaxKey\u003cstring\u003e(\"tableField\");\nOR\n// DataStore name inferred from class \n    var result = await GridColumnDataIndexedDb.GetMaxKey\u003cstring, TableFieldDto\u003e();\n```\n\n### Retrieve Minimum Key\n\n```ValueTask\u003cTKey\u003e GetMinKey\u003cTKey\u003e(string objectStoreName)```\n\n```ValueTask\u003cTKey\u003e GetMinKey\u003cTKey, TEntity\u003e()```\n\n```CSharp\n// Manually set DataStore name\n    var result = await GridColumnDataIndexedDb.GetMinKey\u003cstring\u003e(\"tableField\");\nOR\n// DataStore name inferred from class \n    var result = await GridColumnDataIndexedDb.GetMinKey\u003cstring, TableFieldDto\u003e();\n```\n\n### Retrieve Max value by index\n\n```ValueTask\u003cTIndex\u003e GetMaxIndex\u003cTIndex\u003e(string objectStoreName, string dbIndex)```\n\n```ValueTask\u003cTIndex\u003e GetMaxIndex\u003cTIndex, TEntity\u003e(string dbIndex)```\n\n```CSharp\n// Manually set DataStore name\n    var result = await GridColumnDataIndexedDb.GetMaxIndex\u003cstring\u003e(\"tableField\", \"fieldVisualName\");\nOR\n// DataStore name inferred from class \n    var result = await GridColumnDataIndexedDb.GetMaxIndex\u003cstring, TableFieldDto\u003e(\"fieldVisualName\");\n```\n\n### Retrieve Minimum value by index\n\n```ValueTask\u003cTIndex\u003e GetMinIndex\u003cTIndex\u003e(string objectStoreName, string dbIndex)```\n\n```ValueTask\u003cTIndex\u003e GetMinIndex\u003cTIndex, TEntity\u003e(string dbIndex)```\n\n```CSharp\n// Manually set DataStore name\n    var result = await GridColumnDataIndexedDb.GetMinIndex\u003cstring\u003e(\"tableField\", \"fieldVisualName\");\nOR\n// DataStore name inferred from class \n    var result = await GridColumnDataIndexedDb.GetMinIndex\u003cstring, TableFieldDto\u003e(\"fieldVisualName\");\n```\n\n### Update items in a given store\n\n```ValueTask\u003cstring\u003e UpdateItems\u003cTEntity\u003e(string objectStoreName, List\u003cTEntity\u003e items)```\n\n```ValueTask\u003cstring\u003e UpdateItems\u003cTEntity\u003e(List\u003cTEntity\u003e items)```\n\n```CSharp\n    foreach (var item in items)\n    {\n        item.FieldVisualName = item.FieldVisualName + \"Updated\";\n    }\n    // Manually set DataStore name\n   var result = await GridColumnDataIndexedDb.UpdateItems\u003cTableFieldDto\u003e(\"tableField\", items);\nOR\n// DataStore name inferred from class    \n   var result = await GridColumnDataIndexedDb.UpdateItems\u003cTableFieldDto\u003e(items);\n```\n\n### Delete all items from a store\n\n```ValueTask\u003cstring\u003e DeleteAll(string objectStoreName)```\n\n```ValueTask\u003cstring\u003e DeleteAll\u003cTEntity\u003e()```\n\n```CSharp\n// Manually set DataStore name\n  var result = await GridColumnDataIndexedDb.DeleteAll(\"tableField\");\nOR\n// DataStore name inferred from class \n  var result = await GridColumnDataIndexedDb.DeleteAll\u003cTableFieldDto\u003e();\n```\n\n### Delete an instance of IndexedDB\n\n```ValueTask\u003cstring\u003e DeleteIndexedDb()```\n\n```CSharp\n  var result = await GridColumnDataIndexedDb.DeleteIndexedDb();\n```\n \n \n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Famuste%2FDnetIndexedDb","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Famuste%2FDnetIndexedDb","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Famuste%2FDnetIndexedDb/lists"}