summaryrefslogtreecommitdiff
path: root/addons/crm/static/src
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/crm/static/src
parent0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff)
initial commit 2
Diffstat (limited to 'addons/crm/static/src')
-rw-r--r--addons/crm/static/src/img/autofill.gifbin0 -> 15971 bytes
-rw-r--r--addons/crm/static/src/img/generate-leads.gifbin0 -> 19967 bytes
-rw-r--r--addons/crm/static/src/img/mapview-toggle.gifbin0 -> 35546 bytes
-rw-r--r--addons/crm/static/src/img/pipeline-progress.gifbin0 -> 42184 bytes
-rw-r--r--addons/crm/static/src/img/probability-rate.gifbin0 -> 33059 bytes
-rw-r--r--addons/crm/static/src/js/crm_form.js91
-rw-r--r--addons/crm/static/src/js/crm_kanban.js52
-rw-r--r--addons/crm/static/src/js/systray_activity_menu.js57
-rw-r--r--addons/crm/static/src/js/tours/crm.js94
9 files changed, 294 insertions, 0 deletions
diff --git a/addons/crm/static/src/img/autofill.gif b/addons/crm/static/src/img/autofill.gif
new file mode 100644
index 00000000..d6e6ad6d
--- /dev/null
+++ b/addons/crm/static/src/img/autofill.gif
Binary files differ
diff --git a/addons/crm/static/src/img/generate-leads.gif b/addons/crm/static/src/img/generate-leads.gif
new file mode 100644
index 00000000..1fc56ceb
--- /dev/null
+++ b/addons/crm/static/src/img/generate-leads.gif
Binary files differ
diff --git a/addons/crm/static/src/img/mapview-toggle.gif b/addons/crm/static/src/img/mapview-toggle.gif
new file mode 100644
index 00000000..b611d456
--- /dev/null
+++ b/addons/crm/static/src/img/mapview-toggle.gif
Binary files differ
diff --git a/addons/crm/static/src/img/pipeline-progress.gif b/addons/crm/static/src/img/pipeline-progress.gif
new file mode 100644
index 00000000..f97de03f
--- /dev/null
+++ b/addons/crm/static/src/img/pipeline-progress.gif
Binary files differ
diff --git a/addons/crm/static/src/img/probability-rate.gif b/addons/crm/static/src/img/probability-rate.gif
new file mode 100644
index 00000000..57517833
--- /dev/null
+++ b/addons/crm/static/src/img/probability-rate.gif
Binary files differ
diff --git a/addons/crm/static/src/js/crm_form.js b/addons/crm/static/src/js/crm_form.js
new file mode 100644
index 00000000..40845647
--- /dev/null
+++ b/addons/crm/static/src/js/crm_form.js
@@ -0,0 +1,91 @@
+odoo.define("crm.crm_form", function (require) {
+ "use strict";
+
+ /**
+ * This From Controller makes sure we display a rainbowman message
+ * when the stage is won, even when we click on the statusbar.
+ * When the stage of a lead is changed and data are saved, we check
+ * if the lead is won and if a message should be displayed to the user
+ * with a rainbowman like when the user click on the button "Mark Won".
+ */
+
+ var FormController = require('web.FormController');
+ var FormView = require('web.FormView');
+ var viewRegistry = require('web.view_registry');
+
+ var CrmFormController = FormController.extend({
+ /**
+ * Main method used when saving the record hitting the "Save" button.
+ * We check if the stage_id field was altered and if we need to display a rainbowman
+ * message.
+ *
+ * @override
+ */
+ saveRecord: function () {
+ return this._super(...arguments).then((modifiedFields) => {
+ if (modifiedFields.indexOf('stage_id') !== -1) {
+ this._checkRainbowmanMessage(this.renderer.state.res_id)
+ }
+ });
+ },
+
+ //--------------------------------------------------------------------------
+ // Private
+ //--------------------------------------------------------------------------
+
+ /**
+ * Apply change may be called with 'event.data.force_save' set to True.
+ * This typically happens when directly clicking in the statusbar widget on a new stage.
+ * If it's the case, we check for a modified stage_id field and if we need to display a
+ * rainbowman message.
+ *
+ * @param {string} dataPointID
+ * @param {Object} changes
+ * @param {OdooEvent} event
+ * @override
+ * @private
+ */
+ _applyChanges: function (dataPointID, changes, event) {
+ return this._super(...arguments).then(() => {
+ if (event.data.force_save && 'stage_id' in changes) {
+ this._checkRainbowmanMessage(parseInt(event.target.res_id));
+ }
+ });
+ },
+
+ /**
+ * When updating a crm.lead, through direct use of the status bar or when saving the
+ * record, we check for a rainbowman message to display.
+ *
+ * (see Widget docstring for more information).
+ *
+ * @param {integer} recordId
+ */
+ _checkRainbowmanMessage: async function(recordId) {
+ const message = await this._rpc({
+ model: 'crm.lead',
+ method : 'get_rainbowman_message',
+ args: [[recordId]],
+ });
+ if (message) {
+ this.trigger_up('show_effect', {
+ message: message,
+ type: 'rainbow_man',
+ });
+ }
+ }
+ });
+
+ var CrmFormView = FormView.extend({
+ config: _.extend({}, FormView.prototype.config, {
+ Controller: CrmFormController,
+ }),
+ });
+
+ viewRegistry.add('crm_form', CrmFormView);
+
+ return {
+ CrmFormController: CrmFormController,
+ CrmFormView: CrmFormView,
+ };
+});
diff --git a/addons/crm/static/src/js/crm_kanban.js b/addons/crm/static/src/js/crm_kanban.js
new file mode 100644
index 00000000..dbc50064
--- /dev/null
+++ b/addons/crm/static/src/js/crm_kanban.js
@@ -0,0 +1,52 @@
+odoo.define('crm.crm_kanban', function (require) {
+ "use strict";
+
+ /**
+ * This Kanban Model make sure we display a rainbowman
+ * message when a lead is won after we moved it in the
+ * correct column and when it's grouped by stage_id (default).
+ */
+
+ var KanbanModel = require('web.KanbanModel');
+ var KanbanView = require('web.KanbanView');
+ var viewRegistry = require('web.view_registry');
+
+ var CrmKanbanModel = KanbanModel.extend({
+ /**
+ * Check if the kanban view is grouped by "stage_id" before checking if the lead is won
+ * and displaying a possible rainbowman message.
+ * @override
+ */
+ moveRecord: async function (recordID, groupID, parentID) {
+ var result = await this._super(...arguments);
+ if (this.localData[parentID].groupedBy[0] === this.defaultGroupedBy[0]) {
+ const message = await this._rpc({
+ model: 'crm.lead',
+ method : 'get_rainbowman_message',
+ args: [[parseInt(this.localData[recordID].res_id)]],
+ });
+ if (message) {
+ this.trigger_up('show_effect', {
+ message: message,
+ type: 'rainbow_man',
+ });
+ }
+ }
+ return result;
+ },
+ });
+
+ var CrmKanbanView = KanbanView.extend({
+ config: _.extend({}, KanbanView.prototype.config, {
+ Model: CrmKanbanModel,
+ }),
+ });
+
+ viewRegistry.add('crm_kanban', CrmKanbanView);
+
+ return {
+ CrmKanbanModel: CrmKanbanModel,
+ CrmKanbanView: CrmKanbanView,
+ };
+
+});
diff --git a/addons/crm/static/src/js/systray_activity_menu.js b/addons/crm/static/src/js/systray_activity_menu.js
new file mode 100644
index 00000000..8a1f71b0
--- /dev/null
+++ b/addons/crm/static/src/js/systray_activity_menu.js
@@ -0,0 +1,57 @@
+odoo.define('crm.systray.ActivityMenu', function (require) {
+"use strict";
+
+var ActivityMenu = require('mail.systray.ActivityMenu');
+
+ActivityMenu.include({
+
+ //--------------------------------------------------
+ // Private
+ //--------------------------------------------------
+
+ /**
+ * @override
+ */
+ _getViewsList(model) {
+ if (model === "crm.lead") {
+ return [[false, 'list'], [false, 'kanban'],
+ [false, 'form'], [false, 'calendar'],
+ [false, 'pivot'], [false, 'graph'],
+ [false, 'activity']
+ ];
+ }
+ return this._super(...arguments);
+ },
+
+ //-----------------------------------------
+ // Handlers
+ //-----------------------------------------
+
+ /**
+ * @private
+ * @override
+ */
+ _onActivityFilterClick: function (event) {
+ // fetch the data from the button otherwise fetch the ones from the parent (.o_mail_preview).
+ var data = _.extend({}, $(event.currentTarget).data(), $(event.target).data());
+ var context = {};
+ if (data.res_model === "crm.lead") {
+ if (data.filter === 'my') {
+ context['search_default_activities_overdue'] = 1;
+ context['search_default_activities_today'] = 1;
+ } else {
+ context['search_default_activities_' + data.filter] = 1;
+ }
+ // Necessary because activity_ids of mail.activity.mixin has auto_join
+ // So, duplicates are faking the count and "Load more" doesn't show up
+ context['force_search_count'] = 1;
+ this.do_action('crm.crm_lead_action_my_activities', {
+ additional_context: context,
+ clear_breadcrumbs: true,
+ });
+ } else {
+ this._super.apply(this, arguments);
+ }
+ },
+});
+});
diff --git a/addons/crm/static/src/js/tours/crm.js b/addons/crm/static/src/js/tours/crm.js
new file mode 100644
index 00000000..8c2e1350
--- /dev/null
+++ b/addons/crm/static/src/js/tours/crm.js
@@ -0,0 +1,94 @@
+odoo.define('crm.tour', function(require) {
+"use strict";
+
+var core = require('web.core');
+var tour = require('web_tour.tour');
+
+var _t = core._t;
+
+tour.register('crm_tour', {
+ url: "/web",
+ rainbowManMessage: _t("Congrats, best of luck catching such big fish! :)"),
+ sequence: 10,
+}, [tour.stepUtils.showAppsMenuItem(), {
+ trigger: '.o_app[data-menu-xmlid="crm.crm_menu_root"]',
+ content: _t('Ready to boost your sales? Let\'s have a look at your <b>Pipeline</b>.'),
+ position: 'bottom',
+ edition: 'community',
+}, {
+ trigger: '.o_app[data-menu-xmlid="crm.crm_menu_root"]',
+ content: _t('Ready to boost your sales? Let\'s have a look at your <b>Pipeline</b>.'),
+ position: 'bottom',
+ edition: 'enterprise',
+}, {
+ trigger: '.o-kanban-button-new',
+ extra_trigger: '.o_opportunity_kanban',
+ content: _t("<b>Create your first opportunity.</b>"),
+ position: 'bottom',
+}, {
+ trigger: ".o_kanban_quick_create .o_field_widget[name='partner_id']",
+ content: _t('<b>Write a few letters</b> to look for a company, or create a new one.'),
+ position: "top",
+ run: function (actions) {
+ actions.text("Brandon Freeman", this.$anchor.find("input"));
+ },
+}, {
+ trigger: ".ui-menu-item > a",
+ auto: true,
+ in_modal: false,
+}, {
+ trigger: ".o_kanban_quick_create .o_kanban_add",
+ content: _t("Now, <b>add your Opportunity</b> to your Pipeline."),
+ position: "bottom",
+}, {
+ trigger: ".o_opportunity_kanban .o_kanban_group:first-child .o_kanban_record:last-child .oe_kanban_content",
+ extra_trigger: ".o_opportunity_kanban",
+ content: _t("<b>Drag &amp; drop opportunities</b> between columns as you progress in your sales cycle."),
+ position: "right",
+ run: "drag_and_drop .o_opportunity_kanban .o_kanban_group:eq(2) ",
+}, {
+ trigger: ".o_kanban_record:not(.o_updating) .o_activity_color_default",
+ extra_trigger: ".o_opportunity_kanban",
+ content: _t("Looks like nothing is planned. :(<br><br><i>Tip : Schedule activities to keep track of everything you have to do!</i>"),
+ position: "bottom",
+}, {
+ trigger: ".o_schedule_activity",
+ extra_trigger: ".o_opportunity_kanban",
+ content: _t("Let's <b>Schedule an Activity.</b>"),
+ position: "bottom",
+ width: 200,
+}, {
+ trigger: '.modal-footer button[name="action_close_dialog"]',
+ content: _t("All set. Let’s <b>Schedule</b> it."),
+ position: "top", // dot NOT move to bottom, it would cause a resize flicker, see task-2476595
+ run: function (actions) {
+ actions.auto('.modal-footer button[special=cancel]');
+ },
+}, {
+ id: "drag_opportunity_to_won_step",
+ trigger: ".o_opportunity_kanban .o_kanban_record:last-child",
+ content: _t("Drag your opportunity to <b>Won</b> when you get the deal. Congrats !"),
+ position: "bottom",
+ run: "drag_and_drop .o_opportunity_kanban .o_kanban_group:eq(3) ",
+}, {
+ trigger: ".o_kanban_record",
+ extra_trigger: ".o_opportunity_kanban",
+ content: _t("Let’s have a look at an Opportunity."),
+ position: "right",
+ run: function (actions) {
+ actions.auto(".o_kanban_record");
+ },
+}, {
+ trigger: ".o_lead_opportunity_form .o_statusbar_status",
+ content: _t("This bar also allows you to switch stage."),
+ position: "bottom"
+}, {
+ trigger: ".breadcrumb-item:not(.active):first",
+ content: _t("Click on the breadcrumb to go back to the Pipeline."),
+ position: "bottom",
+ run: function (actions) {
+ actions.auto(".breadcrumb-item:not(.active):last");
+ }
+}]);
+
+});