summaryrefslogtreecommitdiff
path: root/addons/website_slides/static/src/js/website_slides.editor.js
diff options
context:
space:
mode:
authorstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
committerstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
commit3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch)
treea44932296ef4a9b71d5f010906253d8c53727726 /addons/website_slides/static/src/js/website_slides.editor.js
parent0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff)
initial commit 2
Diffstat (limited to 'addons/website_slides/static/src/js/website_slides.editor.js')
-rw-r--r--addons/website_slides/static/src/js/website_slides.editor.js188
1 files changed, 188 insertions, 0 deletions
diff --git a/addons/website_slides/static/src/js/website_slides.editor.js b/addons/website_slides/static/src/js/website_slides.editor.js
new file mode 100644
index 00000000..8ee780a2
--- /dev/null
+++ b/addons/website_slides/static/src/js/website_slides.editor.js
@@ -0,0 +1,188 @@
+odoo.define('website_slides.editor', function (require) {
+"use strict";
+
+var core = require('web.core');
+var Dialog = require('web.Dialog');
+var QWeb = core.qweb;
+var WebsiteNewMenu = require('website.newMenu');
+var TagCourseDialog = require('website_slides.channel_tag.add').TagCourseDialog;
+var wUtils = require('website.utils');
+
+var _t = core._t;
+
+
+var ChannelCreateDialog = Dialog.extend({
+ template: 'website.slide.channel.create',
+ xmlDependencies: Dialog.prototype.xmlDependencies.concat(
+ ['/website_slides/static/src/xml/website_slides_channel.xml',
+ '/website_slides/static/src/xml/website_slides_channel_tag.xml']
+ ),
+ events: _.extend({}, Dialog.prototype.events, {
+ 'change input#tag_ids' : '_onChangeTag',
+ }),
+ custom_events: _.extend({}, Dialog.prototype.custom_events, {
+ 'tag_refresh': '_onTagRefresh',
+ 'tag_remove_new': '_onTagRemoveNew',
+ }),
+ /**
+ * @override
+ * @param {Object} parent
+ * @param {Object} options
+ */
+ init: function (parent, options) {
+ options = _.defaults(options || {}, {
+ title: _t("New Course"),
+ size: 'medium',
+ buttons: [{
+ text: _t("Create"),
+ classes: 'btn-primary',
+ click: this._onClickFormSubmit.bind(this)
+ }, {
+ text: _t("Discard"),
+ close: true
+ },]
+ });
+ this._super(parent, options);
+ },
+ start: function () {
+ var self = this;
+ return this._super.apply(this, arguments).then(function () {
+ var $input = self.$('#tag_ids');
+ $input.select2({
+ width: '100%',
+ allowClear: true,
+ formatNoMatches: false,
+ multiple: true,
+ selection_data: false,
+ formatSelection: function (data) {
+ if (data.tag) {
+ data.text = data.tag;
+ }
+ return data.text;
+ },
+ createSearchChoice: function(term, data) {
+ var addedTags = $(this.opts.element).select2('data');
+ if (_.filter(_.union(addedTags, data), function (tag) {
+ return tag.text.toLowerCase().localeCompare(term.toLowerCase()) === 0;
+ }).length === 0) {
+ if (this.opts.can_create) {
+ return {
+ id: _.uniqueId('tag_'),
+ create: true,
+ tag: term,
+ text: _.str.sprintf(_t("Create new Tag '%s'"), term),
+ };
+ } else {
+ return undefined;
+ }
+ }
+ },
+ fill_data: function (query, data) {
+ var that = this,
+ tags = {results: []};
+ _.each(data, function (obj) {
+ if (that.matcher(query.term, obj.name)) {
+ tags.results.push({id: obj.id, text: obj.name});
+ }
+ });
+ query.callback(tags);
+ },
+ query: function (query) {
+ var that = this;
+ // fetch data only once and store it
+ if (!this.selection_data) {
+ self._rpc({
+ route: '/slides/channel/tag/search_read',
+ params: {
+ fields: ['name'],
+ domain: [],
+ }
+ }).then(function (data) {
+ that.can_create = data.can_create;
+ that.fill_data(query, data.read_results);
+ that.selection_data = data.read_results;
+ });
+ } else {
+ this.fill_data(query, this.selection_data);
+ }
+ }
+ });
+ });
+ },
+ _onClickFormSubmit: function (ev) {
+ var $form = this.$("#slide_channel_add_form");
+ var $title = this.$("#title");
+ if (!$title[0].value){
+ $title.addClass('border-danger');
+ this.$("#title-required").removeClass('d-none');
+ } else {
+ $form.submit();
+ }
+ },
+ _onChangeTag: function (ev) {
+ var self = this;
+ var tags = $(ev.currentTarget).select2('data');
+ tags.forEach(function (element) {
+ if (element.create) {
+ new TagCourseDialog(self, { defaultTag: element.text }).open();
+ }
+ });
+ },
+ /**
+ * Replace the new tag ID by its real ID
+ * @param ev
+ * @private
+ */
+ _onTagRefresh: function (ev) {
+ var $tag_ids = $('#tag_ids');
+ var tags = $tag_ids.select2('data');
+ tags.forEach(function (element) {
+ if (element.create) {
+ element.id = ev.data.tag_id;
+ element.create = false;
+ }
+ });
+ $tag_ids.select2('data', tags);
+ // Set selection_data to false to force tag reload
+ $tag_ids.data('select2').opts.selection_data = false;
+ },
+ /**
+ * Remove the created tag if the user clicks on 'Discard' on the create tag Dialog
+ * @private
+ */
+ _onTagRemoveNew: function () {
+ var tags = $('#tag_ids').select2('data');
+ tags = tags.filter(function (value) {
+ return !value.create;
+ });
+ $('#tag_ids').select2('data', tags);
+ },
+});
+
+WebsiteNewMenu.include({
+ actions: _.extend({}, WebsiteNewMenu.prototype.actions || {}, {
+ new_slide_channel: '_createNewSlideChannel',
+ }),
+
+ //--------------------------------------------------------------------------
+ // Actions
+ //--------------------------------------------------------------------------
+
+ /**
+ * Displays the popup to create a new slide channel,
+ * and redirects the user to this channel.
+ *
+ * @private
+ * @returns {Promise} Unresolved if there is a redirection
+ */
+ _createNewSlideChannel: function () {
+ var self = this;
+ var def = new Promise(function (resolve) {
+ var dialog = new ChannelCreateDialog(self, {});
+ dialog.open();
+ dialog.on('closed', self, resolve);
+ });
+ return def;
+ },
+});
+});