diff --git a/assets/javascripts/discourse/components/explorer-schema-onetable.js.es6 b/assets/javascripts/discourse/components/explorer-schema-onetable.js.es6 new file mode 100644 index 0000000..4fa8f9b --- /dev/null +++ b/assets/javascripts/discourse/components/explorer-schema-onetable.js.es6 @@ -0,0 +1,12 @@ +export default Ember.Component.extend({ + classNameBindings: [':schema-table', 'open'], + + open: Em.computed.alias('table.open'), + + _bindClicks: function() { + const self = this; + this.$()./*children('.schema-table-name').*/click(function() { + self.set('open', !self.get('open')); + }); + }.on('didInsertElement') +}); diff --git a/assets/javascripts/discourse/components/explorer-schema.js.es6 b/assets/javascripts/discourse/components/explorer-schema.js.es6 new file mode 100644 index 0000000..2f01893 --- /dev/null +++ b/assets/javascripts/discourse/components/explorer-schema.js.es6 @@ -0,0 +1,108 @@ +export default Ember.Component.extend({ + + transformedSchema: function() { + const schema = this.get('schema'); + + for (let key in schema) { + if (!schema.hasOwnProperty(key)) { + continue; + } + + schema[key].forEach(function(col) { + let notes = false; + if (col.is_nullable) { + notes = "null"; + } + if (col.column_default) { + if (notes) { + notes += ", default " + col.column_default; + } else { + notes = "default " + col.column_default; + } + } + if (notes) { + col.notes = notes; + } + }); + } + return schema; + }.property('schema'), + + rfilter: function() { + if (!Em.isBlank(this.get('filter'))) { + return new RegExp(this.get('filter')); + } + }.property('filter'), + + filterTables: function(schema) { + let tables = []; + const filter = this.get('rfilter'), + haveFilter = !!filter; + + for (let key in schema) { + if (!schema.hasOwnProperty(key)) { + continue; + } + if (!haveFilter) { + tables.push({ + name: key, + columns: schema[key], + open: haveFilter + }); + continue; + } + + // Check the table name vs the filter + if (filter.source == key || filter.source + "s" == key) { + tables.unshift({ + name: key, + columns: schema[key], + open: haveFilter + }); + } else if (filter.test(key)) { + // whole table matches + tables.push({ + name: key, + columns: schema[key], + open: haveFilter + }); + } else { + // filter the columns + let filterCols = []; + schema[key].forEach(function(col) { + if (filter.source == col.column_name) { + filterCols.unshift(col); + } else if (filter.test(col.column_name)) { + filterCols.push(col); + } + }); + if (!Em.isEmpty(filterCols)) { + tables.push({ + name: key, + columns: filterCols, + open: haveFilter + }); + } + } + } + return tables; + }, + + triggerFilter: Discourse.debounce(function() { + this.set('filteredTables', this.filterTables(this.get('transformedSchema'))); + this.set('loading', false); + }, 500).observes('filter'), + + setLoading: function() { + this.set('loading', true); + }.observes('filter'), + + tables: function() { + if (!this.get('filteredTables')) { + this.set('loading', true); + this.triggerFilter(); + return []; + } + return this.get('filteredTables'); + }.property('transformedSchema', 'filteredTables') +}); diff --git a/assets/javascripts/discourse/routes/admin-plugins-explorer.js.es6 b/assets/javascripts/discourse/routes/admin-plugins-explorer.js.es6 index 0438c9b..9091a82 100644 --- a/assets/javascripts/discourse/routes/admin-plugins-explorer.js.es6 +++ b/assets/javascripts/discourse/routes/admin-plugins-explorer.js.es6 @@ -4,6 +4,17 @@ export default Discourse.Route.extend({ queryParams: { id: { replace: true } }, model() { - return this.store.findAll('query'); + const p1 = this.store.findAll('query'); + const p2 = Discourse.ajax('/admin/plugins/explorer/schema.json', {cache: true}); + return p1.then(function(model) { + return p2.then(function(schema) { + return { content: model, schema: schema }; + }); + }); + }, + + setupController: function(controller, model) { + controller.set('model', model.content); + controller.set('schema', model.schema); } }); diff --git a/assets/javascripts/discourse/templates/admin/plugins-explorer-show.hbs b/assets/javascripts/discourse/templates/admin/plugins-explorer-show.hbs index e8aa3f1..9f67ee0 100644 --- a/assets/javascripts/discourse/templates/admin/plugins-explorer-show.hbs +++ b/assets/javascripts/discourse/templates/admin/plugins-explorer-show.hbs @@ -1,27 +1,39 @@ {{#if selectedItem}} -