diff --git a/kfet/static/kfet/js/kfet.api.js b/kfet/static/kfet/js/kfet.api.js index f40ad20f..1d99aaae 100644 --- a/kfet/static/kfet/js/kfet.api.js +++ b/kfet/static/kfet/js/kfet.api.js @@ -171,8 +171,8 @@ class ModelObject { * Returns a string value for the model, to use in comparisons * @see {@link Models.TreeNode.compare|TreeNode.compare} */ - comparevalue() { - return this.id.toString(); + static compare(a, b) { + return a.id - b.id; } } @@ -520,15 +520,11 @@ class Article extends ModelObject { /** * Default values for Article model instances. - * @default { 'id': 0, 'name': '', 'price': 0, 'stock': 0, - * 'category': new ArticleCategory() } + * @default { 'id': 0, 'name': '', 'price': 0, 'stock': 0 } * @see {@link Models.ModelObject.default_data|ModelObject.default_data} */ static get default_data() { - return { - 'id': 0, 'name': '', 'price': 0, 'stock': 0, - 'category': new ArticleCategory(), - }; + return { 'id': 0, 'name': '', 'price': 0, 'stock': 0 }; } /** @@ -603,13 +599,43 @@ class Day extends ModelObject { set date(v) { this._date = dateUTCToParis(v).startOf('date'); } } - /** - * OperationGroup model. Cannot be accessed through API. + * HistoryGroup model. Should not be used without extending. * @extends Models.ModelObject * @memberof Models */ -class OperationGroup extends ModelObject { +class HistoryGroup extends ModelObject { + static get props() { + return ['id', 'at', 'comment', 'valid_by']; + } + + static get default_data() { + return {'id': 0, 'at': moment(), 'comment': '', + 'valid_by': '',}; + } + + /** + * Comparison function between OperationGroup model instances. + * @see {@link Models.ModelObject.compare|ModelObject.compare} + */ + static compare(a, b) { + //Groups are sorted by most recent first + if (a.at < b.at) return 1; + else if (a.at > b.at) return -1; + else return 0; + } + + // Parse the date to a moment() object + get at() { return this._at; } + set at(v) { this._at = dateUTCToParis(v); } +} + +/** + * OperationGroup model. Cannot be accessed through API. + * @extends Models.HistoryGroup + * @memberof Models + */ +class OperationGroup extends HistoryGroup { /** * Properties associated with an opegroup. @@ -618,8 +644,7 @@ class OperationGroup extends ModelObject { * @see {@link Models.ModelObject.props|ModelObject.props} */ static get props() { - return ['id', 'amount', 'at', 'is_cof', 'comment', - 'trigramme', 'valid_by', 'day', 'type']; + return HistoryGroup.props.concat(['is_cof', 'trigramme']); } /** @@ -629,18 +654,10 @@ class OperationGroup extends ModelObject { * @see {@link Models.ModelObject.default_data|ModelObject.default_data} */ static get default_data() { - return {'id': '', 'amount': 0, 'at': moment(), 'is_cof': false, - 'comment': '', 'trigramme': '', 'valid_by': '', 'day': new Day(), - 'type': ''}; + return $.extend({}, HistoryGroup.default_data, + {'amount': 0, 'is_cof': false, 'trigramme': ''}); } - /** - * Verbose name for OperationGroup model. - * @default 'opegroup' - * @see {@link Models.ModelObject.verbose_name|ModelObject.verbose_name} - */ - static get verbose_name() { return 'opegroup'; } - /** * @default {@link Formatters.OpegroupFormatter} */ @@ -648,27 +665,27 @@ class OperationGroup extends ModelObject { return OpegroupFormatter; } - /** - * Comparison function between OperationGroup model instances. - * @see {@link Models.ModelObject.compare|ModelObject.compare} - */ - static compare(a, b) { - //Opegroups are sorted by most recent first - if (a.at < b.at) return 1; - else if (a.at > b.at) return -1; - else return 0; - } - get amount() { return this._amount; } set amount(v) { this._amount = floatCheck(v); } - - // Parse the date to a moment() object - get at() { return this._at; } - set at(v) { this._at = dateUTCToParis(v); } } /** - * Operation model. Cannot be accessed through API. + * TransferGroup model. Cannot be accessed through API. + * @extends Models.HistoryGroup + * @memberof Models + */ +class TransferGroup extends HistoryGroup { + + /** + * @default {@link Formatters.TransferGroupFormatter} + */ + formatter() { + return TransferGroupFormatter; + } +} + +/** + * Operation model. Should not be used directly. * @extends Models.ModelObject * @memberof Models */ @@ -682,13 +699,7 @@ class Operation extends ModelObject { * @see {@link Models.ModelObject.props|ModelObject.props} */ static get props() { - var common = ['id', 'type', 'amount', 'canceled_at', 'canceled_by', - 'is_checkout', 'opegroup']; - var transfer_only = ['from_acc', 'to_acc']; - var purchase_only = ['article_name', 'article_nb', 'addcost_for', - 'addcost_amount']; - - return common.concat(transfer_only, purchase_only); + return ['id', 'amount', 'canceled_at', 'canceled_by']; } /** @@ -699,33 +710,12 @@ class Operation extends ModelObject { * @see {@link Models.ModelObject.default_data|ModelObject.default_data} */ static get default_data() { - var common = {'id': '', 'type': '', 'amount': 0, 'is_checkout': false, - 'canceled_at': undefined, 'canceled_by': '', - 'opegroup': new OperationGroup()}; - var transfer_only = {'from_acc': '', 'to_acc': ''}; - var purchase_only = {'article_name': '', 'article_nb': 0, - 'addcost_amount': 0, 'addcost_for': 0}; - - return $.extend({}, common, transfer_only, purchase_only); - } - - static get verbose_name() { return 'operation'; } - - formatter() { - if (this.type === 'purchase') - return PurchaseFormatter; - else if (this.type == 'transfer') - return TransferFormatter; - else - return SpecialOpeFormatter; + return {'id': '', 'amount': 0, 'canceled_at': undefined, 'canceled_by': '' }; } get amount() { return this._amount; } set amount(v) { this._amount = floatCheck(v); } - get addcost_amount() { return this._addcost_amount; } - set addcost_amount(v) { this._addcost_amount = floatCheck(v); } - get canceled_at() { return this._canceled_at; } set canceled_at(v) { if (v) @@ -735,6 +725,53 @@ class Operation extends ModelObject { } } +class Purchase extends Operation { + static get props() { + return Operation.props.concat( + ['article_name', 'article_nb', 'addcost_amount', 'addcost_for'] + ); + } + + static get default_data() { + return $.extend({}, Operation.default_data, { + 'article_name': '', 'article_nb': 0, + 'addcost_amount': 0, 'addcost_for': '' + }); + } + + formatter() { + return PurchaseFormatter; + } +} + +class SpecialOperation extends Operation { + static get props() { + return Operation.props.concat(['type', 'is_checkout']); + } + + static get default_data() { + return $.extend({}, Operation.default_data, {'type': '', 'is_checkout': false}); + } + + formatter() { + return SpecialOpeFormatter; + } +} + +class Transfer extends Operation { + static get props() { + return Operation.props.concat(['from_acc', 'to_acc']); + } + + static get default_data() { + return $.extend({}, Operation.default_data, {'from_acc': '', 'to_acc': ''}); + } + + formatter() { + return TransferFormatter; + } +} + /** * Node for ModelForest object @@ -805,7 +842,9 @@ class ModelForest { var node = new TreeNode(data.type, content); if (data.child_sort) - node.child_sort = data.child_sort + node.child_sort = this.constructor.models[data.child_sort]; + else + node.child_sort = ModelObject; if (direction <= 0) { if (data.parent) { @@ -864,7 +903,7 @@ class ModelForest { $container.append($rendered); //dirty - node.children.sort(this.constructor.compare.bind(null, this.constructor.models[node.child_sort])); + node.children.sort(this.constructor.compare.bind(null, node.child_sort)); for (let child of node.children) { var $child = this.render_element(child, templates, options); @@ -1018,14 +1057,21 @@ class ArticleList extends APIModelForest { * @extends Models.APIModelList * @memberof Models */ -class OperationList extends APIModelList { +class OperationList extends APIModelForest { /** * Default structure for OperationList instances. * @default [Operation, OperationGroup, Day] * @see {@link Models.ModelList.models|ModelList.models} */ static get models() { - return [Operation, OperationGroup, Day]; + return { + 'day': Day, + 'opegroup': OperationGroup, + 'transfergroup': TransferGroup, + 'purchase': Purchase, + 'specialope': SpecialOperation, + 'transfer': Transfer, + }; } /** @@ -1036,6 +1082,11 @@ class OperationList extends APIModelList { static get url_model() { return Urls['kfet.history.json'](); } + + constructor() { + super(); + this.root_sort = Day; + } } @@ -1331,20 +1382,7 @@ class ArticleFormatter extends Formatter { * @todo don't display trigramme in account_read */ -//TODO display_trigramme option -class OpegroupFormatter extends Formatter { - - /** - * Properties renderable to html. - * @default {@link Models.Opegroup.props} - */ - static get props() { - return OperationGroup.props.concat(['time']); - } - - static prop_amount(a) { - return amountDisplay(a.amount, a.is_cof, a.trigramme); - } +class HistoryGroupFormatter extends Formatter { static prop_time(a) { return a.at.format('HH:mm:ss'); @@ -1358,6 +1396,29 @@ class OpegroupFormatter extends Formatter { } } +class TransferGroupFormatter extends HistoryGroupFormatter { + + static get props() { + return TransferGroup.props.concat(['infos', 'time']); + } + + static prop_infos(a) { + //TODO find better thing to put here + return 'Transferts'; + } +} + +class OpegroupFormatter extends HistoryGroupFormatter { + + static get props() { + return OperationGroup.props.concat(['time']); + } + + static prop_amount(a) { + return amountDisplay(a.amount, a.is_cof, a.trigramme); + } +} + /** * @extends Formatters.Formatter * @memberof Formatters @@ -1393,12 +1454,12 @@ class OperationFormatter extends Formatter { } static prop_amount(a) { - return amountDisplay(a.amount, a.opegroup.is_cof, a.opegroup.trigramme); + return amountDisplay(a.amount, a.is_cof, a.trigramme); } static prop_addcost(a) { if (a.addcost_for) { - return '('+amountDisplay(a.addcost_amount, a.opegroup.is_cof) + return '('+amountDisplay(a.addcost_amount, a.is_cof) +'UKF pour '+a.addcost_for+')'; } else { return '';