{"version":3,"mappings":"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","names":["Operation","options","monthly_interest_rate_ratio","loan_period_months","present_value","future_value","payment_due_at_period_start","pvif","pmt","default_selector","LoanTermSelector","RoomSelectPicker","selector","merged_selector","Factory","DEFAULT_SELECTOR","InputSection","EventEmitter","$","NumbersFormatter","val","value","plainText","legend_tmpl","_template","legend_template","legend_with_hr_tmpl","legend_with_hr_template","mobile_legend_tmpl","mobile_legend_template","show_other_fees_sub_item","show_stamp_duties_sub_item","PIE_CHART_HEIGHT_DEFAULT","PIE_CHART_HEIGHT_INCREMENT_SHOW_STAMP_DUTIES_SUB_ITEMS","PIE_CHART_HEIGHT_INCREMENT_SHOW_OTHER_FEES_SUB_ITEMS","PIE_CHART_TITLE_OFFSETY_DEFAULT","PIE_CHART_SUBTITLE_OFFSETY_DEFAULT","PIE_CHART_TITLE_AND_SUBTITLE_OFFSETY_DECREMENT_SHOW_STAMP_DUTIES_SUB_ITEMS","PIE_CHART_TITLE_AND_SUBTITLE_OFFSETY_DECREMENT_SHOW_OTHER_FEES_SUB_ITEMS","isForListingPage","_once","isForMobilePage","legend_setting","loan_term_years","loan_term_months","total_cost","self","getPieChartHeight","getPieChartTitleOffsetY","Page","getPieChartTitleOffsetX","getPieChartSubtitleOffsetY","getPieChartSubtitleOffsetX","getPieChartBorderWidth","getTitleText","pmt_value","chart","createPieChart","ad_valorem_stamp_duty","down_payment","loan_amount","total_interest","commission","legal_fee","title_font_size","subtitle_font_size","listingPageSubTitleText","I18n","subTitleText","other_fees","stamp_duties","getHighChartData","hideOrShowLegendSubItemStyling","listingPageMortgageCalculatorData","mobileMortgageCalculatorData","mortgageCalculatorData","e","n","Highcharts","pie_chart","PieChart","createTableChart","$el","stamp_duty","TableChart","SCHEDULE_MOBILE_TPL","schedule_mobile_template","SCHEDULE_TPL","schedule_template","LABELS","process_data","schedule","view_obj","year","monthly_schedule","interval","to_html","datum","render","_flow","Schedule","LOAN_TERM_YEAR_MAX","LOAN_TERM_YEAR_MIN","LOAN_TERM_MONTH_MAX","LOAN_TERM_MONTH_MIN","main_navbar_height","banner_height","Calculator","listing_price_value","Promise","CleaveJs","total_height","calculation_result","touchEvent","calculator_data_scrollTop","new_height","parsed_input","years","months","new_years","new_months","css_selector","section","loan_period","MortgageCalculate","resolve","commission_value","current_city_id","DataRetriever","__vitePreload","Routes","url","url_object","URI","param","q_ajax_3","data","schedule_data","Modal","init","obj","init_async"],"ignoreList":[],"sources":["../../../app/assets/javascripts/app/real_estate/mortgage/pmt/calculation/operation.ts","../../../app/assets/javascripts/concepts/real_estate/mortgages/calculator/inputs/loan_term_selector.ts","../../../app/assets/javascripts/concepts/real_estate/mortgages/calculator/inputs/input_section.ts","../../../app/assets/javascripts/concepts/real_estate/mortgages/calculator/legend.html._tpl","../../../app/assets/javascripts/concepts/real_estate/mortgages/calculator/legend_with_hr.html._tpl","../../../app/assets/javascripts/concepts/real_estate/mortgages/calculator/mobile_legend.html._tpl","../../../app/assets/javascripts/concepts/real_estate/mortgages/calculator/pie_chart.ts","../../../app/assets/javascripts/concepts/real_estate/mortgages/calculator/table_chart.ts","../../../app/assets/javascripts/concepts/real_estate/mortgages/calculator/schedule.html._tpl","../../../app/assets/javascripts/concepts/real_estate/mortgages/calculator/schedule_mobile.html._tpl","../../../app/assets/javascripts/concepts/real_estate/mortgages/calculator/schedule.ts","../../../app/assets/javascripts/concepts/real_estate/mortgages/calculator/calculator.ts"],"sourcesContent":["\ninterface OperationOptions {\n annual_interest_rate: string | number\n loan_period_years: string | number\n listing_price: string | number\n loan_amount_ratio: string | number\n future_value?: string | number\n payment_due_at_period_start?: boolean\n}\n\nclass Operation {\n private readonly annual_interest_rate: number\n private readonly loan_period_years: number\n private readonly listing_price: number\n private readonly loan_amount_ratio: number\n // not used in hk\n private readonly future_value = 0 as number\n private readonly payment_due_at_period_start: boolean\n\n constructor(options: OperationOptions){\n this.annual_interest_rate = parseFloat(options.annual_interest_rate.toString())\n this.loan_period_years = parseFloat(options.loan_period_years.toString())\n this.listing_price = parseFloat(options.listing_price.toString())\n this.loan_amount_ratio = parseFloat(options.loan_amount_ratio.toString())\n if (options.future_value != null) {\n this.future_value = parseFloat(options.future_value.toString())\n }\n this.payment_due_at_period_start = (options.payment_due_at_period_start === true)\n }\n\n public call(){\n return {\n result: this.calculate(),\n }\n }\n\n public calculate(){\n const monthly_interest_rate_ratio = this.monthly_interest_rate_ratio()\n const loan_period_months = this.loan_period_months()\n const present_value = this.present_value()\n\n const future_value = this.future_value\n const payment_due_at_period_start = this.payment_due_at_period_start\n\n if (monthly_interest_rate_ratio === 0) {\n return -(present_value + future_value) / loan_period_months\n }\n\n const pvif = Math.pow(1 + monthly_interest_rate_ratio, loan_period_months)\n let pmt = monthly_interest_rate_ratio / (pvif - 1) * -(present_value * pvif + future_value)\n\n if (payment_due_at_period_start) {\n pmt /= (1 + monthly_interest_rate_ratio)\n }\n\n return pmt\n }\n\n private monthly_interest_rate_ratio(){\n return (this.annual_interest_rate / 12.0) / 100.0\n }\n\n private loan_period_months(){\n return (this.loan_period_years * 12.0)\n }\n\n private loan_amount(){\n return (this.listing_price * (this.loan_amount_ratio / 100.0))\n }\n\n private present_value(){\n return this.loan_amount()\n }\n}\n\n\nexport default Operation\n","\nimport {\n RoomSelectPicker,\n} from \"components/js_selectpicker/room_selectpicker\"\nimport {\n InputSelector as BaseInputSelector,\n Selector as BaseSelector,\n} from \"components/js_selectpicker/base\"\n\n\ntype Selector = BaseSelector & {\n container: string\n}\n\ntype InputSelector = BaseInputSelector & {\n container?: string\n}\n\nconst default_selector = {\n scope: \".cell-real-estate-mortgages-calculator_loan-term--container\",\n main: \".cell-real-estate-mortgages-calculator_loan-term\",\n arrow: \".select2-selection__arrow b[role=\\\"presentation\\\"]\",\n first_option: \"option:nth-of-type(1)\",\n container: \".select2-container\",\n}\n\n\nexport class LoanTermSelector extends RoomSelectPicker {\n protected selector: Selector\n\n protected $container: JQuery\n\n constructor(selector?: InputSelector) {\n const merged_selector = Object.assign({}, default_selector, selector)\n\n super(merged_selector)\n\n if (this.$scope.length === 0){\n throw new Error(\"this.$scope absent\")\n }\n\n this.selector = merged_selector\n\n this.$container = this.$scope.find(this.selector.container)\n }\n}\n\n\nconst Factory = {\n create(selector?: InputSelector){\n return new LoanTermSelector(selector)\n },\n}\n\nexport {\n Factory,\n}\n","\nimport $ from \"jquery\"\nimport {EventEmitter} from \"events\"\nimport NumbersFormatter from \"app/numbers/formatter/index\"\n\n\nexport interface Selector {\n scope: string | JQuery\n main: string\n input: string\n}\nexport interface InputSelector {\n scope?: string | JQuery\n main?: string\n input?: string\n}\nconst DEFAULT_SELECTOR = {\n scope: \".cell-real-estate-mortgages-calculator\",\n main: \".cell-real-estate-mortgages-calculator--listing-price\",\n input: \".cell-real-estate-mortgages-calculator_form-input\",\n}\n\n\nexport class InputSection extends EventEmitter {\n protected selector: Selector\n protected $scope: JQuery\n protected $el: JQuery\n protected $input: JQuery\n\n protected min_data: number\n protected max_data: number\n protected default_data: number\n\n constructor(selector?: InputSelector){\n super()\n\n this.selector = Object.assign({}, DEFAULT_SELECTOR, selector)\n this.$scope = $(this.selector.scope)\n this.$el = this.$scope.find(this.selector.main)\n this.$input = this.$el.find(this.selector.input)\n\n this.min_data = this.$el.data(\"min\")\n this.max_data = this.$el.data(\"max\")\n this.default_data = this.$el.data(\"default\")\n\n this.created()\n this.bind_action()\n }\n\n public val(){\n const input_val = this.$input.val()\n if (input_val == null) { return null }\n\n return NumbersFormatter.numberWithoutCommas(this.$input.val())\n }\n\n protected created(){\n return this\n }\n protected bind_action(){\n this.$input.on(\"change\", () => {\n this.onInputChange()\n })\n return this\n }\n protected setInputVal(val: any){\n if (typeof val !== \"string\") { return }\n const value = NumbersFormatter.numberWithoutCommas(val)\n if (value == null) { return }\n\n if (!isFinite(value)){\n this.$input.val(this.default_data)\n }\n else if (value > this.max_data){\n this.$input.val(this.max_data)\n }\n else if (value < this.min_data){\n this.$input.val(this.min_data)\n }\n\n if (this.$input.val() >= 1000){\n this.$input.val(NumbersFormatter.numberWithCommas(this.$input.val() || 0) || 0)\n }\n }\n protected onInputChange(){\n this.setInputVal(this.$input.val())\n this.emit(\"input_change\")\n }\n}\n\nconst Factory = {\n create(selector?: InputSelector){\n return new InputSection(selector)\n },\n}\n\nexport {\n Factory,\n DEFAULT_SELECTOR,\n}\n","\n\t<%= name %>\n\t<%= y %>\n <% if(key === \"stamp_duties\") { %>\n <% if(show_stamp_duties_sub_item) { %>\n \n <% } else { %>\n \n <% } %>\n <% } %>\n\n<% if(show_stamp_duties_sub_item && key === \"stamp_duties\") { %>\n \n \n <%= I18n.t('concepts.real_estate.mortgages.calculator.data.labels.ad_valorem_stamp_duty') %>\n \n <%= ad_valorem_stamp_duty %>\n \n<% } %>\n\n","\n\t<%= name %>\n\t<%= y %>\n\t<% if (show_other_fees_sub_item) { %>\n\t\t\n\t<% } else { %>\n\t\t\n\t<% } %>\n\n<% if (show_other_fees_sub_item) { %>\n\t\n\t\t<%= I18n.t('concepts.real_estate.mortgages.calculator.data.labels.commission.title') %>\n\t\t<%= commission %>\n\t\n\t\n\t\t\n <%= I18n.t('concepts.real_estate.mortgages.calculator.data.labels.legal_fee') %>\n \n\t\t<%= legal_fee %>\n\t\n<% } %>\n
\n\n\t\n\t\t<%= I18n.t('concepts.real_estate.mortgages.calculator.data.labels.loan_term') %>\n\t\n\t\n\t\t<%= I18n.t(\"concepts.real_estate.mortgages.calculator.data.labels.years_and_months\", {year: years, month: months}) %>\n\t\n\n\n\t\n\t\t<%= I18n.t('concepts.real_estate.mortgages.calculator.data.labels.number_of_instalments') %>\n\t\n\t<%= years * 12 + months%>\n\n\n\t\n\t\t<%= I18n.t('concepts.real_estate.mortgages.calculator.data.labels.total_cost') %>\n\t\n\t<%= total_cost %>\n\n","\n\t<%= name %>\n\t<%= y %>\n\n<% if (key === \"stamp_duties\") { %>\n \n \n <%= I18n.t('concepts.real_estate.mortgages.calculator.data.labels.ad_valorem_stamp_duty') %>\n \n <%= ad_valorem_stamp_duty %>\n \n<% } %>\n<% if (key === \"other_fees\") { %>\n\t\n\t\t<%= I18n.t('concepts.real_estate.mortgages.calculator.data.labels.commission.title') %>\n\t\t<%= commission %>\n\t\n\t\n\t\t\n <%= I18n.t('concepts.real_estate.mortgages.calculator.data.labels.legal_fee') %>\n \n\t\t<%= legal_fee %>\n\t\n<% } %>\n","\nimport $ from \"jquery\"\nimport _template from \"lodash/template\"\nimport _once from \"lodash/once\"\nimport {Page} from \"app/multi_device/index\"\nimport NumbersFormatter from \"app/numbers/formatter/index\"\nimport legend_template from \"./legend.html._tpl\"\nimport legend_with_hr_template from \"./legend_with_hr.html._tpl\"\nimport mobile_legend_template from \"./mobile_legend.html._tpl\"\n\n\nimport I18n from \"plugins/i18n-js\"\n\n\nconst legend_tmpl = _template(legend_template)\nconst legend_with_hr_tmpl = _template(legend_with_hr_template)\n\nconst mobile_legend_tmpl = _template(mobile_legend_template)\n\n// indicator for hide/show sub items\nlet show_other_fees_sub_item = false\nlet show_stamp_duties_sub_item = false\n\n// pie chart height value\nconst PIE_CHART_HEIGHT_DEFAULT = 686\n\nconst PIE_CHART_HEIGHT_INCREMENT_SHOW_STAMP_DUTIES_SUB_ITEMS = 30\nconst PIE_CHART_HEIGHT_INCREMENT_SHOW_OTHER_FEES_SUB_ITEMS = 61\n\n// pie chart title and subtitle offset y value\nconst PIE_CHART_TITLE_OFFSETY_DEFAULT = -180\nconst PIE_CHART_SUBTITLE_OFFSETY_DEFAULT = -159.5\n\nconst PIE_CHART_TITLE_AND_SUBTITLE_OFFSETY_DECREMENT_SHOW_STAMP_DUTIES_SUB_ITEMS = 15\nconst PIE_CHART_TITLE_AND_SUBTITLE_OFFSETY_DECREMENT_SHOW_OTHER_FEES_SUB_ITEMS = 31\n\ninterface Selector {\n main: string,\n}\n\nconst default_selector: Selector = {\n main: \".cell-real-estate-mortgages-calculator\",\n}\n\nconst isForListingPage = _once(() => {\n return $(default_selector.main).hasClass(\"cell-real-estate-mortgages-calculator--listing-page-desktop-ver\") ||\n $(default_selector.main).hasClass(\"cell-real-estate-mortgages-calculator-listing-page--mobile\")\n})\n\nconst isForMobilePage = _once(() => {\n return $(default_selector.main).hasClass(\"cell-real-estate-mortgages-calculator--mobile\")\n})\n\n\nconst legend_setting = (loan_term_years: number, loan_term_months: number, total_cost: string | number): Highcharts.LegendOptions => {\n if (isForMobilePage()) {\n return {\n labelFormatter: function(){\n // this value NOT defined coz depends on chart type\n // For pie chart it's point object\n const self = this as unknown as Highcharts.Point\n return mobile_legend_tmpl({\n key: self.key,\n name: self.name,\n ad_valorem_stamp_duty: NumbersFormatter.numberWithCommasAndCurrency((self.ad_valorem_stamp_duty || 0).toString(), 0),\n commission: NumbersFormatter.numberWithCommasAndCurrency((self.commission || 0).toString(), 0),\n legal_fee: NumbersFormatter.numberWithCommasAndCurrency((self.legal_fee || 0).toString(), 0),\n y: self.y !== null ? NumbersFormatter.numberWithCommasAndCurrency((self.y || 0).toString(), 0) : self.value,\n total_cost: total_cost,\n })\n },\n layout: \"vertical\",\n useHTML: true,\n itemMarginBottom: 20,\n\n itemStyle: {\n fontSize: \"12px\",\n fontWeight: \"normal\",\n },\n }\n // TODO: separate Page difference logic by different object\n }\n if (isForListingPage()){\n return {\n labelFormatter: function(){\n // this value NOT defined coz depends on chart type\n // For pie chart it's point object\n const self = this as unknown as Highcharts.Point\n return legend_tmpl({\n key: null,\n show_other_fees_sub_item: false,\n show_stamp_duties_sub_item: false,\n name: self.name,\n y: NumbersFormatter.numberWithCommasAndCurrency((self.y || 0).toString(), 0),\n })\n },\n layout: \"vertical\",\n align: \"right\",\n verticalAlign: \"middle\" ,\n useHTML: true,\n itemMarginBottom: 10,\n itemMarginTop: 10,\n\n itemStyle: {\n fontSize: \"16px\",\n fontWeight: \"normal\",\n fontFamily: \"Lato\",\n },\n }\n }\n\n // should be PageInstance.Enum.real_estate_mortgages_calculator_page\n return {\n labelFormatter: function(){\n // this value NOT defined coz depends on chart type\n // For pie chart it's point object\n const self = this as unknown as Highcharts.Point\n if (self.key === \"other_fees\") {\n return legend_with_hr_tmpl({\n name: self.name,\n y: NumbersFormatter.numberWithCommasAndCurrency((self.y || 0).toString(), 0),\n commission: NumbersFormatter.numberWithCommasAndCurrency((self.commission || 0).toString(), 0),\n legal_fee: NumbersFormatter.numberWithCommasAndCurrency((self.legal_fee || 0).toString(), 0),\n show_other_fees_sub_item: show_other_fees_sub_item,\n years: loan_term_years,\n months: loan_term_months,\n total_cost: total_cost,\n })\n }\n return legend_tmpl({\n key: self.key,\n name: self.name,\n y: NumbersFormatter.numberWithCommasAndCurrency((self.y || 0).toString(), 0),\n ad_valorem_stamp_duty: NumbersFormatter.numberWithCommasAndCurrency((self.ad_valorem_stamp_duty || 0).toString(), 0),\n show_stamp_duties_sub_item: show_stamp_duties_sub_item,\n })\n },\n layout: \"vertical\",\n useHTML: true,\n itemMarginBottom: 20,\n\n itemStyle: {\n fontSize: \"16px\",\n fontWeight: \"normal\",\n fontFamily: \"Lato\",\n },\n }\n}\n\nfunction getPieChartHeight() {\n if (isForListingPage()) {\n return 306\n }\n\n else if (isForMobilePage()) {\n return 574\n }\n\n else {\n if (show_other_fees_sub_item && show_stamp_duties_sub_item){\n return PIE_CHART_HEIGHT_DEFAULT + PIE_CHART_HEIGHT_INCREMENT_SHOW_STAMP_DUTIES_SUB_ITEMS + PIE_CHART_HEIGHT_INCREMENT_SHOW_OTHER_FEES_SUB_ITEMS\n }\n else if (show_stamp_duties_sub_item) {\n return PIE_CHART_HEIGHT_DEFAULT + PIE_CHART_HEIGHT_INCREMENT_SHOW_STAMP_DUTIES_SUB_ITEMS\n }\n else if (show_other_fees_sub_item) {\n return PIE_CHART_HEIGHT_DEFAULT + PIE_CHART_HEIGHT_INCREMENT_SHOW_OTHER_FEES_SUB_ITEMS\n }\n return PIE_CHART_HEIGHT_DEFAULT\n }\n}\n\nfunction getPieChartTitleOffsetY() {\n if (isForListingPage()) {\n return Page.isForMobile() ? -60 : 18\n }\n\n else if (isForMobilePage()) {\n return -216\n }\n\n else {\n if (show_other_fees_sub_item && show_stamp_duties_sub_item) {\n return PIE_CHART_TITLE_OFFSETY_DEFAULT - PIE_CHART_TITLE_AND_SUBTITLE_OFFSETY_DECREMENT_SHOW_STAMP_DUTIES_SUB_ITEMS - PIE_CHART_TITLE_AND_SUBTITLE_OFFSETY_DECREMENT_SHOW_OTHER_FEES_SUB_ITEMS\n }\n else if (show_stamp_duties_sub_item) {\n return PIE_CHART_TITLE_OFFSETY_DEFAULT - PIE_CHART_TITLE_AND_SUBTITLE_OFFSETY_DECREMENT_SHOW_STAMP_DUTIES_SUB_ITEMS\n }\n else if (show_other_fees_sub_item) {\n return PIE_CHART_TITLE_OFFSETY_DEFAULT - PIE_CHART_TITLE_AND_SUBTITLE_OFFSETY_DECREMENT_SHOW_OTHER_FEES_SUB_ITEMS\n }\n return PIE_CHART_TITLE_OFFSETY_DEFAULT\n }\n}\n\nfunction getPieChartTitleOffsetX() {\n if (isForListingPage()) {\n return Page.isForMobile() ? 0 : -175\n }\n\n return 0\n}\n\nfunction getPieChartSubtitleOffsetY() {\n if (isForListingPage()) {\n return Page.isForMobile() ? -40 : 36\n }\n\n else if (isForMobilePage()) {\n return -199\n }\n\n else {\n if (show_other_fees_sub_item && show_stamp_duties_sub_item) {\n return PIE_CHART_SUBTITLE_OFFSETY_DEFAULT - PIE_CHART_TITLE_AND_SUBTITLE_OFFSETY_DECREMENT_SHOW_STAMP_DUTIES_SUB_ITEMS - PIE_CHART_TITLE_AND_SUBTITLE_OFFSETY_DECREMENT_SHOW_OTHER_FEES_SUB_ITEMS\n }\n else if (show_stamp_duties_sub_item) {\n return PIE_CHART_SUBTITLE_OFFSETY_DEFAULT - PIE_CHART_TITLE_AND_SUBTITLE_OFFSETY_DECREMENT_SHOW_STAMP_DUTIES_SUB_ITEMS\n }\n else if (show_other_fees_sub_item) {\n return PIE_CHART_SUBTITLE_OFFSETY_DEFAULT - PIE_CHART_TITLE_AND_SUBTITLE_OFFSETY_DECREMENT_SHOW_OTHER_FEES_SUB_ITEMS\n }\n return PIE_CHART_SUBTITLE_OFFSETY_DEFAULT\n }\n}\n\nfunction getPieChartSubtitleOffsetX() {\n if (isForListingPage()) {\n return Page.isForMobile() ? 0 : -175\n }\n\n return 0\n}\n\nfunction getPieChartBorderWidth() {\n if (isForMobilePage()) {\n return 20;\n }\n\n else if (isForListingPage()) {\n return 24\n }\n\n return 33\n}\n\nfunction getTitleText(total_cost: number | string, pmt_value: number) {\n if (isForListingPage()) {\n return total_cost.toString()\n }\n\n else if (isForMobilePage()) {\n return \"$\" + NumbersFormatter.numberWithCommas(Math.abs(pmt_value).toFixed(0))\n }\n\n return NumbersFormatter.numberWithCommasAndCurrency(pmt_value, 0)\n}\n\nlet chart = null as null | Highcharts.Chart\nconst createPieChart = ({ad_valorem_stamp_duty, down_payment, loan_amount, total_interest, commission, legal_fee, total_cost, pmt_value, loan_term_years, loan_term_months}: {\n ad_valorem_stamp_duty: number,\n down_payment: number,\n loan_amount: number,\n total_interest: number,\n commission: number,\n legal_fee: number,\n total_cost: number | string,\n pmt_value: number,\n loan_term_years: number,\n loan_term_months: number,\n}): void => {\n\n const title_font_size = Page.isForMobile() ? \"18px\" : \"28px\"\n const subtitle_font_size = Page.isForMobile() ? \"12px\" : \"16px\"\n\n const listingPageSubTitleText = I18n.t(\"concepts.real_estate.mortgages.calculator.data.headings.buying_cost\")\n const subTitleText = I18n.t(\"concepts.real_estate.mortgages.calculator.data.labels.per_month\")\n\n const other_fees = commission + legal_fee\n const stamp_duties = ad_valorem_stamp_duty\n // no need to destroy?\n // if (chart !== null) chart.empty().destroy()\n const options: Highcharts.Options = {\n chart: {\n animation: false,\n spacingTop: 20,\n spacingBottom: isForListingPage() ? 20 : 0,\n plotShadow: false,\n type: \"pie\",\n height: getPieChartHeight(),\n },\n lang: {\n thousandsSep: \",\",\n },\n title: {\n text: getTitleText(total_cost, pmt_value),\n verticalAlign: \"middle\",\n y: getPieChartTitleOffsetY(),\n x: getPieChartTitleOffsetX(),\n\n style: {\n fontSize: title_font_size,\n fontWeight: \"bold\",\n fontFamily: \"Lato\",\n },\n },\n subtitle: {\n text: isForListingPage() ? listingPageSubTitleText : subTitleText,\n verticalAlign: \"middle\",\n y: getPieChartSubtitleOffsetY(),\n x: getPieChartSubtitleOffsetX(),\n\n style: {\n fontSize: subtitle_font_size,\n fontFamily: \"Lato\",\n },\n },\n plotOptions: {\n pie: {\n allowPointSelect: true,\n cursor: \"pointer\",\n dataLabels: {\n enabled: false,\n },\n\n showInLegend: true,\n innerSize: \"100%\",\n borderWidth: getPieChartBorderWidth(),\n borderColor: null,\n slicedOffset: 0,\n },\n },\n legend: legend_setting(loan_term_years, loan_term_months, total_cost),\n credits: {\n enabled: false,\n },\n tooltip: {\n formatter: function(){\n // this value defined in definition not picked up, Type script bug?\n const self = this as unknown as Highcharts.TooltipFormatterContextObject\n return `${self.point.name} (${NumbersFormatter.numberWithCommasAndCurrency(self.y.toString(), 0)})`\n },\n enabled: true,\n },\n series: [\n {\n type: \"pie\",\n colorByPoint: true,\n data: getHighChartData(),\n } as unknown as Highcharts.SeriesPieOptions,\n ],\n }\n\n function hideOrShowLegendSubItemStyling() {\n if (show_other_fees_sub_item && show_stamp_duties_sub_item) {\n chart?.setSize(0, PIE_CHART_HEIGHT_DEFAULT + PIE_CHART_HEIGHT_INCREMENT_SHOW_STAMP_DUTIES_SUB_ITEMS + PIE_CHART_HEIGHT_INCREMENT_SHOW_OTHER_FEES_SUB_ITEMS)\n chart?.setTitle({y: PIE_CHART_TITLE_OFFSETY_DEFAULT - PIE_CHART_TITLE_AND_SUBTITLE_OFFSETY_DECREMENT_SHOW_STAMP_DUTIES_SUB_ITEMS - PIE_CHART_TITLE_AND_SUBTITLE_OFFSETY_DECREMENT_SHOW_OTHER_FEES_SUB_ITEMS})\n chart?.setSubtitle({y: PIE_CHART_SUBTITLE_OFFSETY_DEFAULT - PIE_CHART_TITLE_AND_SUBTITLE_OFFSETY_DECREMENT_SHOW_STAMP_DUTIES_SUB_ITEMS - PIE_CHART_TITLE_AND_SUBTITLE_OFFSETY_DECREMENT_SHOW_OTHER_FEES_SUB_ITEMS})\n }\n else if (show_stamp_duties_sub_item) {\n chart?.setSize(0, PIE_CHART_HEIGHT_DEFAULT + PIE_CHART_HEIGHT_INCREMENT_SHOW_STAMP_DUTIES_SUB_ITEMS)\n chart?.setTitle({y: PIE_CHART_TITLE_OFFSETY_DEFAULT - PIE_CHART_TITLE_AND_SUBTITLE_OFFSETY_DECREMENT_SHOW_STAMP_DUTIES_SUB_ITEMS})\n chart?.setSubtitle({y: PIE_CHART_SUBTITLE_OFFSETY_DEFAULT - PIE_CHART_TITLE_AND_SUBTITLE_OFFSETY_DECREMENT_SHOW_STAMP_DUTIES_SUB_ITEMS})\n }\n else if (show_other_fees_sub_item) {\n chart?.setSize(0, PIE_CHART_HEIGHT_DEFAULT + PIE_CHART_HEIGHT_INCREMENT_SHOW_OTHER_FEES_SUB_ITEMS)\n chart?.setTitle({y: PIE_CHART_TITLE_OFFSETY_DEFAULT - PIE_CHART_TITLE_AND_SUBTITLE_OFFSETY_DECREMENT_SHOW_OTHER_FEES_SUB_ITEMS})\n chart?.setSubtitle({y: PIE_CHART_SUBTITLE_OFFSETY_DEFAULT - PIE_CHART_TITLE_AND_SUBTITLE_OFFSETY_DECREMENT_SHOW_OTHER_FEES_SUB_ITEMS})\n }\n else {\n chart?.setSize(0, PIE_CHART_HEIGHT_DEFAULT)\n chart?.setTitle({y: PIE_CHART_TITLE_OFFSETY_DEFAULT})\n chart?.setSubtitle({y: PIE_CHART_SUBTITLE_OFFSETY_DEFAULT})\n }\n }\n\n // Pie charts Data items group\n function getHighChartData() {\n if (isForListingPage()) {\n return listingPageMortgageCalculatorData()\n }\n else if(isForMobilePage()){\n return mobileMortgageCalculatorData()\n }\n return mortgageCalculatorData()\n }\n\n function listingPageMortgageCalculatorData() {\n return [\n {\n key: \"loan_amount\",\n name: I18n.t(\"concepts.real_estate.mortgages.calculator.data.labels.total_loan\"),\n y: (loan_amount),\n color: \"#BAE0C6\",\n sliced: true,\n },\n {\n key: \"down_payment\",\n name: I18n.t(\"concepts.real_estate.mortgages.calculator.data.labels.down_payment\"),\n y: (down_payment),\n color: \"#2773B8\",\n sliced: true,\n },\n {\n key: \"total_interest\",\n name: I18n.t(\"concepts.real_estate.mortgages.calculator.data.labels.total_interest\"),\n y: (total_interest),\n color: \"#53BACE\",\n sliced: true,\n },\n {\n key: \"stamp_duties\",\n name: I18n.t(\"concepts.real_estate.mortgages.calculator.data.labels.stamp_duty\"),\n y: (stamp_duties),\n color: \"#E7E9B3\",\n ad_valorem_stamp_duty: ad_valorem_stamp_duty,\n sliced: true,\n },\n {\n key: \"commission\",\n name: I18n.t(\"concepts.real_estate.mortgages.calculator.data.labels.commission.title\"),\n y: (commission),\n color: \"#DBDBDB\",\n commission: commission,\n legal_fee: legal_fee,\n sliced: true,\n },\n ]\n }\n\n function mortgageCalculatorData() {\n return [\n // dummy legend item(s) for spacing between chart and legend items group, will be removed if there is a better way for doing this\n {\n key: \"null\",\n name: \"\",\n y: null,\n color: \"#FFF\",\n enabled: false,\n },\n // end of dummy item(s)\n {\n key: \"loan_amount\",\n name: I18n.t(\"concepts.real_estate.mortgages.calculator.data.labels.total_loan\"),\n y: (loan_amount),\n color: \"#BAE0C6\",\n sliced: true,\n },\n {\n key: \"down_payment\",\n name: I18n.t(\"concepts.real_estate.mortgages.calculator.data.labels.down_payment\"),\n y: (down_payment),\n color: \"#2773B8\",\n sliced: true,\n },\n {\n key: \"total_interest\",\n name: I18n.t(\"concepts.real_estate.mortgages.calculator.data.labels.total_interest\"),\n y: (total_interest),\n color: \"#53BACE\",\n sliced: true,\n },\n {\n key: \"stamp_duties\",\n name: I18n.t(\"concepts.real_estate.mortgages.calculator.data.labels.stamp_duties\"),\n y: (stamp_duties),\n color: \"#E7E9B3\",\n ad_valorem_stamp_duty: ad_valorem_stamp_duty,\n sliced: true,\n events:\n {\n legendItemClick: (e: Event) => {\n e.preventDefault()\n if (show_stamp_duties_sub_item){\n show_stamp_duties_sub_item = false\n }\n else {\n show_stamp_duties_sub_item = true\n }\n hideOrShowLegendSubItemStyling()\n },\n },\n },\n {\n key: \"other_fees\",\n name: I18n.t(\"concepts.real_estate.mortgages.calculator.data.labels.other_fees\"),\n y: (other_fees),\n color: \"#DBDBDB\",\n commission: commission,\n legal_fee: legal_fee,\n sliced: true,\n events:\n {\n legendItemClick: (e: Event) => {\n e.preventDefault()\n if (show_other_fees_sub_item) {\n show_other_fees_sub_item = false\n }\n else {\n show_other_fees_sub_item = true\n }\n hideOrShowLegendSubItemStyling()\n },\n },\n },\n ]\n }\n\n function mobileMortgageCalculatorData() {\n return [\n // dummy legend item(s) for spacing between chart and legend items group, will be removed if there is a better way for doing this\n {\n key: \"null\",\n name: \"\",\n y: null,\n color: \"#FFF\",\n enabled: false,\n },\n // end of dummy item(s)\n {\n key: \"loan_amount\",\n name: I18n.t(\"concepts.real_estate.mortgages.calculator.data.labels.total_loan\"),\n y: (loan_amount),\n color: \"#BAE0C6\",\n sliced: true,\n },\n {\n key: \"down_payment\",\n name: I18n.t(\"concepts.real_estate.mortgages.calculator.data.labels.down_payment\"),\n y: (down_payment),\n color: \"#2773B8\",\n sliced: true,\n },\n {\n key: \"total_interest\",\n name: I18n.t(\"concepts.real_estate.mortgages.calculator.data.labels.total_interest\"),\n y: (total_interest),\n color: \"#53BACE\",\n sliced: true,\n },\n {\n key: \"stamp_duties\",\n name: I18n.t(\"concepts.real_estate.mortgages.calculator.data.labels.stamp_duty\"),\n y: (stamp_duties),\n color: \"#E7E9B3\",\n ad_valorem_stamp_duty: ad_valorem_stamp_duty,\n sliced: true,\n },\n {\n key: \"other_fees\",\n name: I18n.t(\"concepts.real_estate.mortgages.calculator.data.labels.commission.title\"),\n y: (commission),\n color: \"#DBDBDB\",\n commission: commission,\n legal_fee: legal_fee,\n sliced: true,\n },\n {\n key: null,\n name: I18n.t(\"concepts.real_estate.mortgages.calculator.data.labels.loan_term\"),\n y: null,\n value: I18n.t(\"concepts.real_estate.mortgages.calculator.data.labels.years_and_months\", {year: loan_term_years, month: loan_term_months}),\n color: \"#FFF\",\n sliced: true,\n events:\n {\n legendItemClick: (e: Event) => {\n e.preventDefault()\n },\n },\n },\n {\n key: null,\n name: I18n.t(\"concepts.real_estate.mortgages.calculator.data.labels.number_of_instalments\"),\n y: null,\n value: loan_term_years * 12 + loan_term_months,\n color: \"#FFF\",\n sliced: true,\n events:\n {\n legendItemClick: (e: Event) => {\n e.preventDefault()\n },\n },\n },\n {\n key: null,\n name: I18n.t(\"concepts.real_estate.mortgages.calculator.data.labels.total_cost\"),\n y: null,\n value: total_cost,\n color: \"#FFF\",\n sliced: true,\n events:\n {\n legendItemClick: (e: Event) => {\n e.preventDefault()\n },\n },\n },\n\n ]\n }\n // end of Data items group\n\n\n import(\n \"highcharts\"\n )\n .then((Highcharts) => {\n // Workaround for \"Highcharts is not defined\"\n window.Highcharts = Highcharts\n const pie_chart: Highcharts.HTMLDOMElement = document.getElementById(\"cell-real-estate-mortgages-calculator_pie-chart\") as Highcharts.HTMLDOMElement\n\n chart = new Highcharts.Chart(\n pie_chart,\n options,\n () => {\n // This is required for staging/dev due to an issue\n // that causes the chart not drawn on load\n // Thus `reflow` is called\n // No visual change if the chart is displayed correctly already (like prod)\n setTimeout(() => {\n chart?.reflow()\n }, 0)\n setTimeout(() => {\n chart?.reflow()\n }, 100)\n setTimeout(() => {\n chart?.reflow()\n }, 500)\n }\n )\n })\n}\n\n\nexport default {\n create: createPieChart,\n}\n","import $ from \"jquery\"\nimport NumbersFormatter from \"app/numbers/formatter/index\"\n\ninterface Selector {\n main: string,\n loan_amount: string,\n stamp_duty: string,\n commission: string,\n down_payment: string,\n total_principle: string,\n total_interest: string,\n other_fees: string\n}\n\nconst default_selector: Selector = {\n main: \".cell-real-estate-mortgages-calculator\",\n loan_amount: \".cell-real-estate-mortgages-calculator_data--mortgage-breakdown--loan-amount\",\n stamp_duty: \".cell-real-estate-mortgages-calculator_data--mortgage-breakdown--stamp-duty\",\n commission: \".cell-real-estate-mortgages-calculator_data--mortgage-breakdown--commission\",\n down_payment: \".cell-real-estate-mortgages-calculator_data--mortgage-breakdown--down-payment\",\n total_principle: \".cell-real-estate-mortgages-calculator_data--mortgage-breakdown--principle\",\n total_interest: \".cell-real-estate-mortgages-calculator_data--mortgage-breakdown--interest\",\n other_fees: \".cell-real-estate-mortgages-calculator_data--mortgage-breakdown--other-fees\",\n}\n\nconst createTableChart = ({ad_valorem_stamp_duty, down_payment, loan_amount, total_interest, commission, total_cost, legal_fee}: {\n ad_valorem_stamp_duty: number,\n down_payment: number,\n loan_amount: number,\n total_interest: number,\n commission: number,\n total_cost: number | string,\n legal_fee: number\n}):void => {\n const $el = $(default_selector.main)\n\n // pending for moblie website update\n const stamp_duty = ad_valorem_stamp_duty\n\n $el.find(default_selector.loan_amount).text(NumbersFormatter.numberWithCommasAndCurrency(loan_amount, 0) || \"\")\n $el.find(default_selector.stamp_duty).text(NumbersFormatter.numberWithCommasAndCurrency(stamp_duty, 0) || \"\")\n $el.find(default_selector.commission).text(NumbersFormatter.numberWithCommasAndCurrency(commission, 0) || \"\")\n $el.find(default_selector.down_payment).text(NumbersFormatter.numberWithCommasAndCurrency(down_payment, 0) || \"\")\n $el.find(default_selector.total_principle).text(total_cost)\n $el.find(default_selector.total_interest).text(NumbersFormatter.numberWithCommasAndCurrency(total_interest, 0) || \"\")\n $el.find(default_selector.other_fees).text(NumbersFormatter.numberWithCommasAndCurrency(commission + legal_fee, 0) || \"\")\n}\n\nexport default {\n create: createTableChart,\n}\n","
\n\t
\n\t\t
\n\t\t\t<%= I18n.t('concepts.real_estate.mortgages.calculator.schedule.labels.summary') %>\n\t\t
\n\n
\n
\n
\n <%= I18n.t('concepts.real_estate.mortgages.calculator.schedule.labels.month') %>\n
\n
\n <%= I18n.t('concepts.real_estate.mortgages.calculator.schedule.labels.installment') %>\n
\n
\n <%= I18n.t('concepts.real_estate.mortgages.calculator.schedule.labels.principle_repayment') %>\n
\n
\n <%= I18n.t('concepts.real_estate.mortgages.calculator.schedule.labels.interest_payment') %>\n
\n
\n <%= I18n.t('concepts.real_estate.mortgages.calculator.schedule.labels.outstanding_payment') %>\n
\n
\n
\n\n
\n <% for(var year in schedule) { %>\n <% for(var interval in schedule[year].monthly_schedule ) { %>\n
\n
\n <%= schedule[year].monthly_schedule[interval].month %>\n
\n
\n <%= schedule[year].monthly_schedule[interval].pmt_value %>\n
\n
\n <%= schedule[year].monthly_schedule[interval].principle %>\n
\n
\n <%= schedule[year].monthly_schedule[interval].interest %>\n
\n
\n <%= schedule[year].monthly_schedule[interval].loan_balance %>\n
\n
\n <% } %>\n\n
\n
\n
\n <%= schedule[year].year %>\n
\n
\n <%= labels.breakdown %>\n
\n
\n
\n
\n <%= schedule[year].ytd_pmt_value %>\n
\n
\n <%= labels.total_installment %>\n
\n
\n
\n
\n <%= schedule[year].ytd_principle %>\n
\n
\n <%= labels.total_principle %>\n
\n
\n
\n
\n <%= schedule[year].ytd_interest %>\n
\n
\n <%= labels.total_interest %>\n
\n
\n
\n
\n <%= schedule[year].loan_balance %>\n
\n
\n <%= labels.outstanding %>\n
\n
\n
\n <% } %>\n
\n\t
\n
\n\n","
\n\t
\n\t\t
\n\t\t\t<%= I18n.t('concepts.real_estate.mortgages.calculator.schedule.labels.summary') %>\n
×
\n\t\t
\n\n
\n
\n
\n <%= I18n.t('concepts.real_estate.mortgages.calculator.schedule.labels.month') %>\n
\n
\n <%= I18n.t('concepts.real_estate.mortgages.calculator.schedule.labels.installment') %>\n
\n
\n <%= I18n.t('concepts.real_estate.mortgages.calculator.schedule.labels.principle') %>\n
\n
\n <%= I18n.t('concepts.real_estate.mortgages.calculator.schedule.labels.interest') %>\n
\n
\n <%= I18n.t('concepts.real_estate.mortgages.calculator.schedule.labels.outstanding') %>\n
\n
\n
\n\n
\n <% for(var year in schedule) { %>\n <% for(var interval in schedule[year].monthly_schedule ) { %>\n
\n
\n <%= schedule[year].monthly_schedule[interval].month %>\n
\n
\n <%= schedule[year].monthly_schedule[interval].pmt_value %>\n
\n
\n <%= schedule[year].monthly_schedule[interval].principle %>\n
\n
\n <%= schedule[year].monthly_schedule[interval].interest %>\n
\n
\n <%= schedule[year].monthly_schedule[interval].loan_balance %>\n
\n
\n <% } %>\n\n
\n
\n
\n <%= schedule[year].year %>\n
\n
\n <%= labels.breakdown %>\n
\n
\n
\n
\n <%= schedule[year].ytd_pmt_value %>\n
\n
\n <%= labels.total_installment %>\n
\n
\n
\n
\n <%= schedule[year].ytd_principle %>\n
\n
\n <%= labels.total_principle %>\n
\n
\n
\n
\n <%= schedule[year].ytd_interest %>\n
\n
\n <%= labels.total_interest %>\n
\n
\n
\n
\n <%= schedule[year].loan_balance %>\n
\n
\n <%= labels.outstanding %>\n
\n
\n
\n <% } %>\n
\n\t
\n
\n\n","\nimport _template from \"lodash/template\"\nimport _flow from \"lodash/flow\"\nimport schedule_template from \"./schedule.html._tpl\"\nimport schedule_mobile_template from \"./schedule_mobile.html._tpl\"\nimport NumbersFormatter from \"app/numbers/formatter/index\"\n\n\nimport I18n from \"plugins/i18n-js\"\nimport { Page } from \"app/multi_device\"\n\n\ninterface MonthScheduleEntry {\n month: number,\n pmt_value: number\n interest: number\n principle: number\n loan_balance: number\n total_interest: number\n}\ninterface YearScheduleEntry {\n year: number\n\n ytd_interest: number\n ytd_pmt_value: number\n ytd_principle: number\n loan_balance: number\n total_interest: number\n\n monthly_schedule: MonthScheduleEntry[]\n}\n\n\ninterface OutputMonthScheduleEntry {\n month: number\n\n pmt_value: string | undefined\n principle: string | undefined\n interest: string | undefined\n loan_balance: string | undefined\n}\ninterface OutputYearScheduleEntry {\n year: string\n\n ytd_pmt_value: string | undefined\n ytd_principle: string | undefined\n ytd_interest: string | undefined\n loan_balance: string | undefined\n\n monthly_schedule: OutputMonthScheduleEntry[]\n}\n\n\n\nconst SCHEDULE_MOBILE_TPL = _template(schedule_mobile_template)\nconst SCHEDULE_TPL = _template(schedule_template)\n\nconst LABELS = {\n breakdown: I18n.t(\"concepts.real_estate.mortgages.calculator.schedule.labels.breakdown\"),\n total_installment: I18n.t(\"concepts.real_estate.mortgages.calculator.schedule.labels.total_installment\"),\n total_principle: I18n.t(\"concepts.real_estate.mortgages.calculator.schedule.labels.total_principle\"),\n total_interest: I18n.t(\"concepts.real_estate.mortgages.calculator.schedule.labels.total_interest\"),\n outstanding: I18n.t(\"concepts.real_estate.mortgages.calculator.schedule.labels.outstanding\"),\n}\n\n\nconst process_data = (schedule: YearScheduleEntry[]): OutputYearScheduleEntry[] => {\n const view_obj = [] as Array<{\n year: string\n\n ytd_pmt_value: string | undefined\n ytd_principle: string | undefined\n ytd_interest: string | undefined\n loan_balance: string | undefined\n\n monthly_schedule: Array<{\n month: number\n\n pmt_value: string | undefined\n principle: string | undefined\n interest: string | undefined\n loan_balance: string | undefined\n }>\n }>\n schedule.forEach((year) => {\n const monthly_schedule = [] as OutputMonthScheduleEntry[]\n year.monthly_schedule.forEach((interval) => {\n if(Page.isForMobile()){\n monthly_schedule.push({\n month: interval.month,\n pmt_value: NumbersFormatter.numberWithCommas(interval.pmt_value.toFixed(0)),\n principle: NumbersFormatter.numberWithCommas(interval.principle.toFixed(0)),\n interest: NumbersFormatter.numberWithCommas(interval.interest.toFixed(0)),\n loan_balance: NumbersFormatter.numberWithCommas(interval.loan_balance.toFixed(0)),\n })\n }\n else {\n monthly_schedule.push({\n month: interval.month,\n pmt_value: NumbersFormatter.numberWithCommasAndCurrency(interval.pmt_value.toFixed(2)),\n principle: NumbersFormatter.numberWithCommasAndCurrency(interval.principle.toFixed(2)),\n interest: NumbersFormatter.numberWithCommasAndCurrency(interval.interest.toFixed(2)),\n loan_balance: NumbersFormatter.numberWithCommasAndCurrency(interval.loan_balance.toFixed(2)),\n })\n }\n })\n if(Page.isForMobile()) {\n view_obj.push({\n year: I18n.t(\"concepts.real_estate.mortgages.calculator.schedule.labels.year\", {year: year.year}),\n ytd_pmt_value: NumbersFormatter.numberWithCommas(year.ytd_pmt_value.toFixed(0)),\n ytd_principle: NumbersFormatter.numberWithCommas(year.ytd_principle.toFixed(0)),\n ytd_interest: NumbersFormatter.numberWithCommas(year.ytd_interest.toFixed(0)),\n loan_balance: NumbersFormatter.numberWithCommas(year.loan_balance.toFixed(0)),\n\n monthly_schedule: monthly_schedule,\n })\n }\n else {\n view_obj.push({\n year: I18n.t(\"concepts.real_estate.mortgages.calculator.schedule.labels.year\", {year: year.year}),\n ytd_pmt_value: NumbersFormatter.numberWithCommasAndCurrency(year.ytd_pmt_value.toFixed(2)),\n ytd_principle: NumbersFormatter.numberWithCommasAndCurrency(year.ytd_principle.toFixed(2)),\n ytd_interest: NumbersFormatter.numberWithCommasAndCurrency(year.ytd_interest.toFixed(2)),\n loan_balance: NumbersFormatter.numberWithCommasAndCurrency(year.loan_balance.toFixed(2)),\n\n monthly_schedule: monthly_schedule,\n })\n }\n })\n return view_obj\n}\n\nconst to_html = (datum: unknown) => {\n return Page.isForMobile() ? SCHEDULE_MOBILE_TPL({schedule: datum, labels: LABELS}) : SCHEDULE_TPL({schedule: datum, labels: LABELS})\n}\n\nconst render = _flow(process_data, to_html)\n\n\nexport default {\n render,\n}\n","\n// region JS Imports\n\n// region External Modules\nimport $ from \"jquery\"\nimport Promise from \"plugins/bluebird\"\nimport CleaveJs from \"plugins/cleave-js/index\"\nimport param from \"jquery-param\"\nimport URI from \"urijs\"\n\nimport I18n from \"plugins/i18n-js\"\n// endregion External Modules\n\n// Private Modules\nimport NumbersFormatter from \"app/numbers/formatter/index\"\nimport MortgageCalculate from \"app/real_estate/mortgage/pmt/calculation/operation\"\nimport DataRetriever from \"app/data_retriever\"\n\nimport {\n q_ajax_3,\n} from \"app/utils/q_ajax/q_ajax_3\"\n// Private Modules\n\n// region Public Components\n// endregion Public Components\n\n// region Private Components\nimport {\n Factory as LoanTermSelector,\n} from \"./inputs/loan_term_selector\"\n\nimport {\n InputSection,\n} from \"./inputs/input_section\"\n\nimport PieChart from \"./pie_chart\"\nimport TableChart from \"./table_chart\"\nimport Schedule from \"./schedule\"\n// endregion Private Components\n\n// endregion JS Imports\n\nimport Modal from \"app/modal/show-modal\"\n\ninterface Selector {\n scope: string\n main: string\n form_input: string\n listing_price: string\n loan_amount: string\n loan_amount_ratio: string\n loan_amount_value: string\n down_payment: string\n interest_rate: string\n commission: string\n commission_rate: string\n legal_fee: string\n\n loan_period_container: string\n loan_period: string\n payment_text: string\n loan_term_years: string\n loan_term_months: string\n loan_term_increment: string\n loan_term_decrement: string\n\n schedule_container: string\n schedule_cell: string\n schedule_cell_toggle: string\n\n calculator_data: string\n pie_chart: string\n mortgage_breakdown: string\n\n pie_chart_container: string\n}\ninterface InputSelector {\n scope?: string | JQuery\n main?: string | JQuery\n form_input?: string\n listing_price?: string\n loan_amount?: string\n loan_amount_ratio?: string\n loan_amount_value?: string\n down_payment?: string\n interest_rate?: string\n commission?: string\n commission_rate?: string\n legal_fee?: string\n\n loan_period_container?: string\n loan_period?: string\n payment_text?: string\n loan_term_years?: string\n loan_term_months?: string\n loan_term_increment?: string\n loan_term_decrement?: string\n\n schedule_container?: string\n schedule_cell?: string\n schedule_cell_toggle?: string\n\n calculator_data: string\n pie_chart: string\n mortgage_breakdown: string\n\n pie_chart_container?: string\n}\nconst DEFAULT_SELECTOR = {\n scope: \"body\",\n main: \".cell-real-estate-mortgages-calculator\",\n form_input: \".cell-real-estate-mortgages-calculator_form-input\",\n listing_price: \".cell-real-estate-mortgages-calculator--listing-price\",\n loan_amount: \".cell-real-estate-mortgages-calculator--loan-amount\",\n loan_amount_value: \".cell-real-estate-mortgages-calculator_form-loan-amount-input\",\n loan_amount_ratio: \".cell-real-estate-mortgages-calculator_form-loan-amount-ratio-input\",\n down_payment: \".cell-real-estate-mortgages-calculator--down-payment\",\n interest_rate: \".cell-real-estate-mortgages-calculator--interest-rate\",\n commission: \".cell-real-estate-mortgages-calculator--commission\",\n commission_rate: \".cell-real-estate-mortgages-calculator--commission-rate\",\n legal_fee: \".cell-real-estate-mortgages-calculator--legal-fee\",\n\n loan_period_container: \".cell-real-estate-mortgages-calculator_loan-term--container\",\n loan_period: \".cell-real-estate-mortgages-calculator_loan-term\",\n payment_text: \".cell-real-estate-mortgages-calculator_data--monthly-payment-text\",\n loan_term_years: \".cell-real-estate-mortgages-calculator--loan-term-years\",\n loan_term_months: \".cell-real-estate-mortgages-calculator--loan-term-months\",\n loan_term_increment: \".cell-real-estate-mortgages-calculator_form_input--increment\",\n loan_term_decrement: \".cell-real-estate-mortgages-calculator_form_input--decrement\",\n\n schedule_container: \".cell-real-estate-mortgages-calculator_schedule--table-body\",\n schedule_cell: \".cell-real-estate-mortgages-calculator_schedule\",\n schedule_cell_toggle: \".cell-real-estate-mortgages-calculator_schedule--toggle\",\n\n calculator_data: \".cell-real-estate-mortgages-calculator_data\",\n pie_chart: \".cell-real-estate-mortgages-calculator_pie-chart\",\n mortgage_breakdown: \".cell-real-estate-mortgages-calculator_data--mortgage-breakdown\",\n\n pie_chart_container: \"#cell-real-estate-mortgages-calculator_pie-chart\",\n}\n\nconst LOAN_TERM_YEAR_MAX = 30\nconst LOAN_TERM_YEAR_MIN = 5\nconst LOAN_TERM_MONTH_MAX = 11\nconst LOAN_TERM_MONTH_MIN = 0\n\nconst main_navbar_height = parseFloat($(\"#main-navbar\").css(\"height\"))\nconst banner_height = parseFloat($(\"#layout-section--mobile-searcher-app-smart-banner\").css(\"height\"))\n\ntype SectionType = InputSection\n\nclass Calculator {\n protected selector: Selector\n\n protected $scope: JQuery\n protected $el: JQuery\n\n // for storing smart banner is here or not\n protected smart_banner_is_shown: boolean\n\n protected $loan_period_container: JQuery\n protected $loan_period: JQuery\n\n protected $payment_text: JQuery\n protected $loan_term_years: JQuery\n protected $loan_term_years_input: JQuery\n protected $loan_term_years_increment: JQuery\n protected $loan_term_years_decrement: JQuery\n protected $loan_term_months: JQuery\n protected $loan_term_months_input: JQuery\n protected $loan_term_months_increment: JQuery\n protected $loan_term_months_decrement: JQuery\n\n protected $schedule_container: JQuery\n protected $schedule_cell: JQuery\n protected $schedule_cell_toggle: JQuery\n\n protected $calculator_data: JQuery\n protected $pie_chart: JQuery\n protected $mortgage_breakdown: JQuery\n\n protected $pie_chart_container: JQuery\n\n protected $loan_amount: JQuery\n protected $loan_amount_ratio: JQuery\n protected $loan_amount_value: JQuery\n protected $down_payment: JQuery\n\n protected $interest_rate: JQuery\n\n protected $commission: JQuery\n protected $commission_rate: JQuery\n protected $legal_fee: JQuery\n\n protected sections: {\n listing_price: SectionType | JQuery\n loan_amount: SectionType\n down_payment: SectionType\n interest_rate: SectionType\n commission: SectionType\n commission_rate: SectionType\n legal_fee: SectionType\n loan_term_years: SectionType\n loan_term_months: SectionType\n }\n\n protected calculation_result_init_height: number\n protected clientY: number\n\n constructor(selector?: InputSelector){\n this.selector = Object.assign({}, DEFAULT_SELECTOR, selector)\n this.$scope = $(this.selector.scope)\n this.$el = this.$scope.find(this.selector.main)\n\n this.smart_banner_is_shown = false\n\n // input fields for listing page only\n this.$payment_text = this.$el.find(this.selector.payment_text)\n\n this.$down_payment = this.$el.find(this.selector.down_payment)\n\n this.$loan_period = this.$el.find(this.selector.loan_period)\n this.$loan_period_container = this.$el.find(this.selector.loan_period_container)\n\n this.$commission_rate = this.$el.find(this.selector.commission_rate)\n // end of for listing page only\n\n // initialize the value of these variables to 0 for opening sort menu at first time\n this.calculation_result_init_height = 0\n this.clientY = 0\n\n this.$loan_amount = this.$el.find(this.selector.loan_amount)\n this.$loan_amount_ratio = this.$el.find(this.selector.loan_amount_ratio)\n this.$loan_amount_value = this.$el.find(this.selector.loan_amount_value)\n\n this.$loan_term_years = this.$el.find(this.selector.loan_term_years)\n this.$loan_term_years_input = this.$loan_term_years.find(this.selector.form_input)\n this.$loan_term_years_increment = this.$loan_term_years.find(this.selector.loan_term_increment)\n this.$loan_term_years_decrement = this.$loan_term_years.find(this.selector.loan_term_decrement)\n this.$loan_term_months = this.$el.find(this.selector.loan_term_months)\n this.$loan_term_months_input = this.$loan_term_months.find(this.selector.form_input)\n this.$loan_term_months_increment = this.$loan_term_months.find(this.selector.loan_term_increment)\n this.$loan_term_months_decrement = this.$loan_term_months.find(this.selector.loan_term_decrement)\n\n this.$interest_rate = this.$el.find(this.selector.interest_rate)\n\n this.$commission = this.$el.find(this.selector.commission)\n this.$legal_fee = this.$el.find(this.selector.legal_fee)\n\n this.$schedule_cell = this.$scope.find(this.selector.schedule_cell)\n this.$schedule_container = this.$schedule_cell.find(this.selector.schedule_container)\n this.$schedule_cell_toggle = this.$schedule_cell.find(this.selector.schedule_cell_toggle)\n\n this.$calculator_data = this.$el.find(this.selector.calculator_data)\n this.$pie_chart = this.$el.find(this.selector.pie_chart)\n this.$mortgage_breakdown = this.$el.find(this.selector.mortgage_breakdown)\n\n this.$pie_chart_container = this.$el.find(this.selector.pie_chart_container)\n\n let listing_price_value\n if (this.$el.hasClass(\"cell-real-estate-mortgages-calculator-listing-page--mobile\")){\n listing_price_value = this.$el.find(this.selector.listing_price)\n }else{\n listing_price_value = this.init_section(this.selector.listing_price)\n }\n\n this.sections = {\n listing_price: listing_price_value,\n loan_amount: this.init_section(this.selector.loan_amount),\n down_payment: this.init_section(this.selector.down_payment),\n interest_rate: this.init_section(this.selector.interest_rate),\n commission: this.init_section(this.selector.commission),\n commission_rate: this.init_section(this.selector.commission_rate),\n legal_fee: this.init_section(this.selector.legal_fee),\n loan_term_years: this.init_section(this.selector.loan_term_years),\n loan_term_months: this.init_section(this.selector.loan_term_months),\n }\n\n if (this.$el.length === 0) { return }\n\n if(this.$down_payment.val() != null){\n this.refreshDownPaymentValue()\n }\n\n if (document.querySelector(\".layout-section--mobile-searcher-app-smart-banner--shown\") && document.querySelector(\".cell--mobile-apps--searcher-app--smart-banner--default-style\") != null) {\n this.smart_banner_is_shown = true\n }\n\n this.bind_action()\n }\n\n public created(): Promise {\n if (this.$el.length === 0) {\n return Promise.resolve()\n }\n\n CleaveJs.init()\n\n if (this.$loan_period_container.length > 0) {\n LoanTermSelector.create()\n }\n\n return this.refreshPmtAndSchedule()\n }\n\n protected bind_action(){\n this.$schedule_cell_toggle.on(\"click\", () => {\n this.onScheduleToggleClick()\n })\n\n if (this.$el.hasClass(\"cell-real-estate-mortgages-calculator--mobile\")) {\n let total_height = main_navbar_height + 10\n\n if (this.smart_banner_is_shown) {\n total_height += banner_height\n }\n // change height of calculator data when dismissing download banner\n $(\".cell--mobile-apps--searcher-app--smart-banner--default-style__close-banner-button\").on(\"click\", () => {\n total_height -= banner_height\n\n if (parseFloat(this.$calculator_data.css(\"height\")) !== 180) {\n this.$calculator_data.css({\"height\": \"calc(100% - \" + total_height + \"px)\", \"transition\": \"height 0.2s\"})\n }\n\n // reset smart banner show flag to false\n this.smart_banner_is_shown = false\n })\n\n const calculation_result = document.querySelector(\".cell-real-estate-mortgages-calculator_data\") as Element\n\n calculation_result.addEventListener(\"touchstart\", (e) => {\n const touchEvent: TouchEvent = e as TouchEvent\n\n this.clientY = touchEvent.touches[0].clientY\n this.calculation_result_init_height = parseFloat(this.$calculator_data.css(\"height\"))\n\n this.$scope.css({\"overflow\": \"hidden\", \"position\": \"fixed\"})\n calculation_result.setAttribute(\"data-slideout-ignore\", \"true\")\n })\n\n let calculator_data_scrollTop = 0\n\n calculation_result.addEventListener(\"touchmove\",(e) => {\n e.preventDefault()\n\n const touchEvent: TouchEvent = e as TouchEvent\n\n let new_height = this.calculation_result_init_height + (this.clientY - touchEvent.touches[0].clientY)\n\n if (this.calculation_result_init_height !== 180) {\n new_height = Math.min(new_height, this.calculation_result_init_height)\n this.$calculator_data.scrollTop(calculator_data_scrollTop + (this.clientY - touchEvent.touches[0].clientY))\n }\n\n if (calculation_result.scrollTop === 0) {\n this.$calculator_data.css({\"height\": Math.max(180, new_height), \"transition\": \"\"})\n }\n\n\n if (new_height > 180) {\n this.$pie_chart.addClass(\"full\")\n this.$mortgage_breakdown.addClass(\"full\")\n }\n else {\n this.$pie_chart.removeClass(\"full\")\n this.$mortgage_breakdown.removeClass(\"full\")\n }\n })\n\n calculation_result.addEventListener(\"touchend\", (e) => {\n const touchEvent: TouchEvent = e as TouchEvent\n\n if (Math.abs(this.clientY - touchEvent.changedTouches[0].clientY) > 0) {\n\n if (this.clientY < touchEvent.changedTouches[0].clientY) {\n this.$calculator_data.scrollTop(0)\n\n this.$calculator_data.css({\"height\": \"180px\", \"transition\": \"height 0.5s\", \"overflow-y\": \"hidden\"})\n setTimeout(() => {\n this.$pie_chart.removeClass(\"full\")\n this.$mortgage_breakdown.removeClass(\"full\")\n },300)\n\n $(\".cell-real-estate-mortgages-calculator_schedule--table-actions\").css(\"display\",\"none\")\n\n this.$scope.css({\"overflow\": \"\", \"position\": \"\"})\n calculation_result.removeAttribute(\"data-slideout-ignore\")\n }\n else {\n this.$calculator_data.css({\"height\": \"calc(100% - \" + total_height + \"px)\", \"transition\": \"height 0.5s\", \"overflow-y\": \"auto\"})\n this.$pie_chart.addClass(\"full\")\n this.$mortgage_breakdown.addClass(\"full\")\n\n $(\".cell-real-estate-mortgages-calculator_schedule--table-actions\").css(\"display\",\"block\")\n }\n }\n else {\n if (calculation_result.getBoundingClientRect().height === 180) {\n this.$scope.css({\"overflow\": \"\", \"position\": \"\"})\n calculation_result.removeAttribute(\"data-slideout-ignore\")\n }\n }\n\n calculator_data_scrollTop = this.$calculator_data.scrollTop() || 0\n })\n }\n\n this.$loan_period.on(\"change\", () => {\n this.refreshPmtAndSchedule().done()\n })\n\n this.$down_payment.on(\"change\", () => {\n this.refreshDownPaymentValue()\n this.refreshPmtAndSchedule().done()\n })\n\n this.$loan_amount_value.on(\"change\", () => {\n this.refreshLoanAmountRatio()\n this.refreshPmtAndSchedule().done()\n })\n\n this.$loan_amount_ratio.on(\"change\", () => {\n this.refreshLoanAmountValue()\n this.refreshPmtAndSchedule().done()\n })\n\n this.$interest_rate.on(\"input\", () => {\n const parsed_input = (this.$interest_rate.find(\"input\").val() as string).split(/[^0-9.]/).join(\"\")\n\n this.$interest_rate.find(\"input\").val(parsed_input.slice(0,5))\n })\n\n // region loan term years and months\n\n this.$loan_term_years_decrement.on(\"click\", () => {\n const years = this.sections.loan_term_years.val() || 0\n const months = this.sections.loan_term_months.val() || 0\n\n if (months === LOAN_TERM_MONTH_MIN && years === LOAN_TERM_YEAR_MIN){\n return\n }\n if (years - 1 < LOAN_TERM_YEAR_MIN) {\n this.$loan_term_months_input.val(\n this.getLoanTermMonthsWithUnit(LOAN_TERM_MONTH_MIN)\n )\n }\n else {\n this.$loan_term_years_input.val(\n this.getLoanTermYearsWithUnit(years - 1)\n )\n }\n this.refreshPmtAndSchedule().done()\n })\n\n this.$loan_term_years_increment.on(\"click\", () => {\n const years = this.sections.loan_term_years.val() || 0\n const months = this.sections.loan_term_months.val() || LOAN_TERM_MONTH_MIN\n\n if (months === LOAN_TERM_MONTH_MIN && years === LOAN_TERM_YEAR_MAX){\n return\n }\n if (years + 1 === LOAN_TERM_YEAR_MAX) {\n this.$loan_term_months_input.val(\n this.getLoanTermMonthsWithUnit(LOAN_TERM_MONTH_MIN)\n )\n }\n this.$loan_term_years_input.val(\n this.getLoanTermYearsWithUnit(years + 1)\n )\n this.refreshPmtAndSchedule().done()\n })\n\n this.$loan_term_months_decrement.on(\"click\", () => {\n const years = this.sections.loan_term_years.val() || 0\n const months = this.sections.loan_term_months.val() || LOAN_TERM_MONTH_MIN\n\n if (months === 0 && years === LOAN_TERM_YEAR_MIN){\n return\n }\n if (months === LOAN_TERM_MONTH_MIN) {\n this.$loan_term_years_input.val(\n this.getLoanTermYearsWithUnit(years - 1)\n )\n this.$loan_term_months_input.val(\n this.getLoanTermMonthsWithUnit(LOAN_TERM_MONTH_MAX)\n )\n }// for 0 months case\n else {\n this.$loan_term_months_input.val(\n this.getLoanTermMonthsWithUnit(months - 1)\n )\n }\n this.refreshPmtAndSchedule().done()\n })\n\n this.$loan_term_months_increment.on(\"click\", () => {\n const years = this.sections.loan_term_years.val() || 0\n const months = this.sections.loan_term_months.val() || LOAN_TERM_MONTH_MIN\n\n if (months === LOAN_TERM_MONTH_MIN && years === LOAN_TERM_YEAR_MAX){\n return\n }\n if (months === LOAN_TERM_MONTH_MAX) {\n this.$loan_term_years_input.val(\n this.getLoanTermYearsWithUnit(years + 1)\n )\n this.$loan_term_months_input.val(\n this.getLoanTermMonthsWithUnit(LOAN_TERM_MONTH_MIN)\n )\n } // for LOAN_TERM_MONTH_MAX months case\n else {\n this.$loan_term_months_input.val(\n this.getLoanTermMonthsWithUnit(months + 1)\n )\n }\n this.refreshPmtAndSchedule().done()\n })\n\n this.$loan_term_years_input.on(\"change\", () => {\n const years = this.sections.loan_term_years.val() || 0\n\n if (years >= LOAN_TERM_YEAR_MAX) {\n this.$loan_term_years_input.val(LOAN_TERM_YEAR_MAX)\n this.$loan_term_months_input.val(this.getLoanTermMonthsWithUnit(LOAN_TERM_MONTH_MIN))\n }\n else if (years <= LOAN_TERM_YEAR_MIN) {\n this.$loan_term_years_input.val(LOAN_TERM_YEAR_MIN)\n this.$loan_term_months_input.val(this.getLoanTermMonthsWithUnit(LOAN_TERM_MONTH_MIN))\n }\n else {\n this.$loan_term_years_input.val(\n this.sections.loan_term_years.val() || 0\n )\n }\n this.$loan_term_years_input.blur()\n })\n\n this.$loan_term_months_input.on(\"change\", () => {\n const years = this.sections.loan_term_years.val() || 0\n const months = this.sections.loan_term_months.val() || LOAN_TERM_MONTH_MIN\n\n if (years === LOAN_TERM_YEAR_MAX){// value of months will always be 0 if value of year is 30\n this.$loan_term_months_input.val(LOAN_TERM_MONTH_MIN)\n }\n else if (months > LOAN_TERM_MONTH_MAX) {// for case months input > 11\n const new_years = Math.min(LOAN_TERM_YEAR_MAX, years + Math.floor(months / 12))\n const new_months = new_years === LOAN_TERM_YEAR_MAX ? LOAN_TERM_MONTH_MIN : months % 12\n this.$loan_term_years_input.val(\n this.getLoanTermYearsWithUnit(new_years)\n )\n this.$loan_term_months_input.val(\n this.getLoanTermMonthsWithUnit(new_months)\n )\n }\n else {\n this.$loan_term_months_input.val(\n months\n )\n }\n this.$loan_term_months_input.blur()\n })\n\n this.$loan_term_years_input.on(\"blur\", () => {\n this.$loan_term_years_input.val(\n this.getLoanTermYearsWithUnit(this.sections.loan_term_years.val() || 0)\n )\n })\n\n this.$loan_term_years_input.on(\"focus\", () => {\n this.$loan_term_years_input.val(\n this.sections.loan_term_years.val() || 0\n )\n })\n\n this.$loan_term_months_input.on(\"blur\", () => {\n this.$loan_term_months_input.val(\n this.getLoanTermMonthsWithUnit(this.sections.loan_term_months.val() || LOAN_TERM_MONTH_MIN)\n )\n })\n\n this.$loan_term_months_input.on(\"focus\", () => {\n this.$loan_term_months_input.val(\n this.sections.loan_term_months.val() || LOAN_TERM_MONTH_MIN\n )\n })\n\n // endregion loan term years and months\n }\n protected init_section(css_selector: string): SectionType {\n\n const section = new InputSection({\n main: css_selector,\n })\n\n section.on(\"input_change\", () => {\n this.refreshPmtAndSchedule().done()\n })\n return section\n }\n\n protected getLoanTermYearsWithUnit(years: number) {\n return years + \" \" + I18n.t(\"concepts.real_estate.mortgages.calculator.data.labels.year\")\n }\n\n protected getLoanTermMonthsWithUnit(months: number) {\n return months + \" \" + I18n.t(\"concepts.real_estate.mortgages.calculator.data.labels.month\")\n }\n\n protected getDownPaymentValue() {\n return Math.round((this.sections.listing_price.val() || 0) * ((this.sections.down_payment.val() || 0) / 100.0))\n }\n protected refreshDownPaymentValue(){\n this.$down_payment.find(\".cell-real-estate-mortgages-calculator_form-inactive-input\").val(\n NumbersFormatter.numberWithCommas(this.getDownPaymentValue()) || \"\")\n }\n protected getLoanAmountValue() {\n return Math.round((this.sections.listing_price.val() || 0) * ((this.$loan_amount_ratio.val() || 0) / 100.0))\n }\n protected getLoanAmountRatio() {\n return ((NumbersFormatter.numberWithoutCommas(this.$loan_amount_value.val()) || 0) / this.sections.listing_price.val()) * 100\n }\n protected refreshLoanAmountValue() {\n this.$loan_amount_value.val(\n NumbersFormatter.numberWithCommas(this.getLoanAmountValue()) || 0\n )\n }\n protected refreshLoanAmountRatio() {\n this.$loan_amount_ratio.val(\n Math.min(Math.round(this.getLoanAmountRatio()), 100) || 0\n )\n }\n protected getFormattedCommissionValue() {\n this.$commission.find(this.selector.form_input).val(\n NumbersFormatter.numberWithCommas(this.sections.commission.val() || 0) || 0\n )\n }\n protected getFormattedLegalFeeValue() {\n this.$legal_fee.find(this.selector.form_input).val(\n NumbersFormatter.numberWithCommas(this.sections.legal_fee.val() || 0) || 0\n )\n }\n protected getLoanTermInputWithUnit() {\n this.$loan_term_years_input.val(\n this.getLoanTermYearsWithUnit(this.sections.loan_term_years.val() || 0)\n )\n this.$loan_term_months_input.val(\n this.getLoanTermMonthsWithUnit(this.sections.loan_term_months.val() || LOAN_TERM_MONTH_MIN)\n )\n }\n protected refreshPmtOnly() {\n this.refreshLoanAmountValue()\n const loan_period = (this.sections.loan_term_years.val() || 0) + (this.sections.loan_term_months.val() || 0) / 12\n const pmt_value = (new MortgageCalculate({\n annual_interest_rate: this.sections.interest_rate.val() || 0,\n loan_period_years: Math.min(LOAN_TERM_YEAR_MAX, loan_period) || this.$loan_period.val(),\n listing_price: this.sections.listing_price.val() || 0,\n loan_amount_ratio: this.sections.loan_amount.val() || (100 - (this.sections.down_payment.val() || 0)),\n })).call().result\n this.$payment_text.text(NumbersFormatter.numberWithCommasAndCurrency(pmt_value) || \"\")\n return pmt_value\n }\n protected refreshPmtAndSchedule(): Promise {\n return new Promise((resolve) => {\n\n this.getLoanTermInputWithUnit()\n this.getFormattedCommissionValue()\n this.getFormattedLegalFeeValue()\n\n const pmt_value = this.refreshPmtOnly()\n const commission_value = this.sections.listing_price.val() * (this.sections.commission_rate.val() || 0) / 100\n\n const current_city_id = DataRetriever.get(\"current-city-id\")\n Promise.resolve(\n import(\n \"plugins/js-routes\"\n )\n )\n .then((Routes) => {\n window.Routes = Routes\n const url = Routes.schedule_calculator_city_real_estate_mortgages_path(I18n.locale, current_city_id)\n const url_object = URI(url)\n url_object.query(param({\n loan_term_years: this.sections.loan_term_years.val() || this.$loan_period.val(),\n loan_term_months: this.sections.loan_term_months.val() || 0,\n listing_price: this.sections.listing_price.val(),\n loan_amount_ratio: this.sections.loan_amount.val() || (100 - (this.sections.down_payment.val() || 0)),\n annual_interest_rate: this.sections.interest_rate.val(),\n commission: this.sections.commission.val() || commission_value,\n legal_fee: this.sections.legal_fee.val() || 0,\n pmt_value: pmt_value,\n }))\n\n q_ajax_3({\n url: url_object.toString(),\n method: \"GET\",\n dataType: \"json\",\n })\n .then(({data}) => {\n const {ad_valorem_stamp_duty, down_payment, loan_amount, total_interest, commission, total_cost, schedule_data, legal_fee, loan_term_years, loan_term_months} = data\n if (this.$pie_chart_container.length > 0 ){\n PieChart.create({\n ad_valorem_stamp_duty,\n down_payment,\n loan_amount,\n total_interest,\n commission,\n total_cost,\n legal_fee,\n pmt_value,\n loan_term_years,\n loan_term_months,\n })\n if (this.$el.hasClass(\"cell-real-estate-mortgages-calculator--mobile\")) {\n TableChart.create({\n ad_valorem_stamp_duty,\n down_payment,\n loan_amount,\n total_interest,\n commission,\n total_cost,\n legal_fee,\n })\n }\n }else{\n TableChart.create({\n ad_valorem_stamp_duty,\n down_payment,\n loan_amount,\n total_interest,\n commission,\n total_cost,\n legal_fee,\n })\n }\n\n if (this.$schedule_container.length > 0 ){\n this.$schedule_container.html(Schedule.render(schedule_data))\n }\n\n resolve()\n })\n })\n .done()\n })\n }\n protected onScheduleToggleClick(){\n Modal.showModalWithContent(this.$schedule_container, {\n customContent: true,\n class: \"container\",\n })\n // This part will be used later\n // $(\".cell-real-estate-mortgages-calculator_schedule--table-title-download\").on(\"click\", () => {\n // // TODO: generate and download a pdf file with schedule data when click it\n\n // // put codes below back to shedule.html._tpl after finishing this function\n // // \n // // \t<%= I18n.t('concepts.real_estate.mortgages.calculator.schedule.labels.installment') %>.pdf\n // // \t\n // // \n\n // })\n }\n}\n\n\n\nconst init = (): Calculator => {\n const obj = new Calculator()\n obj.created().done()\n return obj\n}\n\nfunction init_async(): Promise {\n const obj = new Calculator()\n return obj.created()\n}\n\n\nexport {\n init as default,\n init,\n init_async,\n}\n"],"file":"assets/calculator-BUoqAPHa.js"}