You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

landingPage.vue 15KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518
  1. <template>
  2. <div v-if="checkAccess" class="container">
  3. <div class="container">
  4. <div class="row">
  5. <div class="col">
  6. <div class="section-header">
  7. <h2>Landing Page</h2>
  8. </div>
  9. </div>
  10. </div>
  11. </div>
  12. <div v-if="loaded" class="container col-md-12" style="text-align:left">
  13. <div class="form-goup row">
  14. <div class="col-md-4">
  15. <float-label>
  16. <input
  17. class="form-control uniInput"
  18. type="text"
  19. v-model="campaign.name"
  20. placeholder="CAMPAIGN NAME"
  21. />
  22. </float-label>
  23. </div>
  24. <div class="col-md-4">
  25. <float-label fixed label="START DATE">
  26. <input class="form-control uniInput" type="date" v-model="campaign.startDate" />
  27. </float-label>
  28. </div>
  29. <div class="col-md-4">
  30. <float-label fixed label="END DATE">
  31. <input class="form-control uniInput" type="date" v-model="campaign.endDate" />
  32. </float-label>
  33. </div>
  34. </div>
  35. <div class="row mt-4">
  36. <div class="col-md-4">
  37. <float-label>
  38. <input
  39. class="form-control uniInput"
  40. type="text"
  41. v-model="campaign.subject"
  42. placeholder="SUBJECT"
  43. />
  44. </float-label>
  45. </div>
  46. <div class="col-md-4">
  47. <float-label>
  48. <input
  49. class="form-control uniInput"
  50. type="number"
  51. v-model="campaign.itemsPerRow"
  52. placeholder="NUMBER OF ITEMS PER ROW"
  53. />
  54. </float-label>
  55. </div>
  56. </div>
  57. <br />
  58. <div class="col-md-12">
  59. <label>Main Body</label>
  60. <ul class="nav nav-tabs" id="myTab" role="tablist">
  61. <li class="nav-item">
  62. <a
  63. class="nav-link active"
  64. id="directions-tab"
  65. data-toggle="tab"
  66. href="#directions"
  67. role="tab"
  68. aria-controls="directions"
  69. aria-selected="false"
  70. >Html</a
  71. >
  72. </li>
  73. <li class="nav-item">
  74. <a
  75. class="nav-link"
  76. id="resort-layout-tab"
  77. data-toggle="tab"
  78. href="#resort-layout"
  79. role="tab"
  80. aria-controls="resort-layout"
  81. aria-selected="true"
  82. >Preview</a
  83. >
  84. </li>
  85. </ul>
  86. <div
  87. class="tab-content"
  88. id="myTabContent"
  89. style="background-color:rgba(255,255,255,0.75);padding:10px;border:silver solid thin;border-radius:10px;"
  90. >
  91. <div
  92. class="tab-pane fade show active"
  93. style="background-color:rgba(255,255,255,0.75);padding:10px;"
  94. id="directions"
  95. role="tabpanel"
  96. aria-labelledby="directions-tab"
  97. >
  98. <div class="text-left">
  99. <div class="input-group mb-3">
  100. <label>
  101. <i>Place the tag [items] as a place holder for the week items.</i>
  102. </label>
  103. </div>
  104. <div class="input-group mb-3">
  105. <!-- <div class="input-group-prepend">
  106. <span class="input-group-text" style="color: #60CBEB">
  107. <b>B</b>
  108. </span>
  109. </div>-->
  110. <textarea
  111. class="form-control"
  112. type="text"
  113. rows="10"
  114. step="any"
  115. name="levy"
  116. v-model="campaign.body"
  117. />
  118. </div>
  119. </div>
  120. </div>
  121. <div
  122. class="tab-pane fade"
  123. id="resort-layout"
  124. role="tabpanel"
  125. aria-labelledby="resort-layout-tab"
  126. >
  127. <div class="no-style" v-html="campaign.body"></div>
  128. </div>
  129. </div>
  130. </div>
  131. <br />
  132. <div class="col-md-12">
  133. <label>Item Template</label>
  134. <ul class="nav nav-tabs" id="myTab" role="tablist">
  135. <li class="nav-item">
  136. <a
  137. class="nav-link active"
  138. id="template-tab"
  139. data-toggle="tab"
  140. href="#template"
  141. role="tab"
  142. aria-controls="template"
  143. aria-selected="false"
  144. >Html</a
  145. >
  146. </li>
  147. <li class="nav-item">
  148. <a
  149. class="nav-link"
  150. id="preview-tab"
  151. data-toggle="tab"
  152. href="#preview"
  153. role="tab"
  154. aria-controls="preview"
  155. aria-selected="true"
  156. >Preview</a
  157. >
  158. </li>
  159. </ul>
  160. <div
  161. class="tab-content"
  162. id="myTabContent"
  163. style="background-color:rgba(255,255,255,0.75);padding:10px;border:silver solid thin;border-radius:10px;"
  164. >
  165. <div
  166. class="tab-pane fade show active"
  167. style="background-color:rgba(255,255,255,0.75);padding:10px;"
  168. id="template"
  169. role="tabpanel"
  170. aria-labelledby="template-tab"
  171. >
  172. <div class="text-left">
  173. <div class="input-group mb-3">
  174. <label>
  175. <i>
  176. Place the tag [image] as a place holder for the week's image.
  177. <br />Place the tag [link] for a hypher link to the week's page
  178. </i>
  179. </label>
  180. </div>
  181. <div class="input-group mb-3">
  182. <!-- <div class="input-group-prepend">
  183. <span class="input-group-text" style="color: #60CBEB">
  184. <b>B</b>
  185. </span>
  186. </div>-->
  187. <textarea
  188. class="form-control"
  189. type="text"
  190. rows="10"
  191. step="any"
  192. name="levy"
  193. v-model="campaign.itemBody"
  194. />
  195. </div>
  196. </div>
  197. </div>
  198. <div class="tab-pane fade" id="preview" role="tabpanel" aria-labelledby="preview-tab">
  199. <div class="no-style" v-html="campaign.itemBody"></div>
  200. </div>
  201. </div>
  202. </div>
  203. <div class="col-md-12"></div>
  204. <br />
  205. <div class="col-md-12">
  206. <label>
  207. <b>Place Holders</b>
  208. </label>
  209. <div class="d-flex">
  210. <div class="p-2">
  211. <div class="btn-solid-blue" @click="addClose()" v-if="CanEdit">
  212. {{ btnCaption }}
  213. </div>
  214. </div>
  215. </div>
  216. </div>
  217. <div class="col-md-12" v-if="showNew">
  218. <LandingPageItems
  219. @onItemAdd="onItemAdd"
  220. :selectedClass="CheckType"
  221. :canSelectClass="false"
  222. />
  223. </div>
  224. <div class="col-md-12">
  225. <hr />
  226. </div>
  227. <div class="col-md-12">
  228. <ListView
  229. :items="PlaceHolders"
  230. :hideSearch="true"
  231. :showColumnChooser="false"
  232. :showNew="false"
  233. :allowMultipleSelect="true"
  234. :canEdit="false"
  235. :deleteable="CanEdit"
  236. @onDelete="onItemDelete"
  237. :displayColumns="placeHolderColumns"
  238. />
  239. <!-- :displayColumns="placeHolderColumns" -->
  240. </div>
  241. <br />
  242. <div class="col-md-12">
  243. <label>
  244. <b>Weeks</b>
  245. </label>
  246. <div class="d-flex">
  247. <div class="p-2">
  248. <div class="btn-solid-blue" @click="addWeekClose()" v-if="CanEditWeeks">
  249. {{ btnCaptionWeek }}
  250. </div>
  251. </div>
  252. </div>
  253. </div>
  254. <div class="col-md-12" v-if="showNewWeek">
  255. <WeekAdd @onWeekItemAdd="AddNewWeek" />
  256. </div>
  257. <div class="col-md-12">
  258. <hr />
  259. </div>
  260. <div class="col-md-12">
  261. <ListView
  262. :items="Weeks"
  263. :hideSearch="true"
  264. :showColumnChooser="false"
  265. :showNew="false"
  266. :canEdit="false"
  267. :deleteable="CanEdit"
  268. :allowMultipleSelect="false"
  269. @onDelete="onItemDeleteWeek"
  270. :displayColumns="weekColumns"
  271. :displayFormats="weekFormats"
  272. />
  273. <!-- -->
  274. </div>
  275. <br />
  276. <br />
  277. <div class="form-group row">
  278. <button type="button" @click="SaveData()" class="btn-solid-blue">
  279. Save
  280. </button>
  281. <button type="button" @click="Close()" class="btn-solid-blue">
  282. Close
  283. </button>
  284. </div>
  285. </div>
  286. <div v-else id="preloader"></div>
  287. </div>
  288. <div v-else class="container">
  289. <div class="row">
  290. <div class="col">
  291. <alert :text="'You don\'t have permission to view this page'" :type="'ERROR'" />
  292. </div>
  293. </div>
  294. </div>
  295. </template>
  296. <script>
  297. /* eslint-disable */
  298. import { VueEditor } from "vue2-editor";
  299. import { mapState, mapActions } from "vuex";
  300. import Log from "../../assets/Log";
  301. import alert from "../shared/alert";
  302. import FieldEditor from "../../components/shared/fieldEditor";
  303. import ListView from "../shared/listView.vue";
  304. import Search from "../admin/misc/carouselSearch.vue";
  305. import LandingPageItems from "./landingPageItems.vue";
  306. import WeekAdd from "./landingPageWeek.vue";
  307. export default {
  308. name: "LandingPage",
  309. components: {
  310. VueEditor,
  311. FieldEditor,
  312. Search,
  313. LandingPageItems,
  314. ListView,
  315. WeekAdd,
  316. alert
  317. },
  318. data() {
  319. return {
  320. loaded: false,
  321. wait: false,
  322. isNew: true,
  323. showNew: false,
  324. showNewWeek: false,
  325. weekColumns: ["image", "weekUni"],
  326. weekFormats: ["image", ""],
  327. placeHolderColumns: ["name", "boundTo", "format"],
  328. defaultPlaceholderClass: this.CheckType
  329. };
  330. },
  331. props: {
  332. passedDown: {},
  333. placeHolders: [],
  334. weeks: [],
  335. editable: {
  336. default: true
  337. }
  338. },
  339. methods: {
  340. ...mapActions("campaign", [
  341. "getCampaign",
  342. "saveCampaign",
  343. "updateCampaign",
  344. "getCampaignItems",
  345. "getCampaignPlaceHolders"
  346. ]),
  347. SaveData() {
  348. this.wait = true;
  349. if (this.isNew) {
  350. this.campaign.isTimeshare = true;
  351. for (let i = 0; i < this.campaign.items.length; i++) {
  352. this.campaign.items[i].week = undefined;
  353. if (
  354. this.campaign.items[i].placeHolders &&
  355. this.campaign.items[i].placeHolders.length > 0
  356. ) {
  357. this.campaign.items[i].campaignItemPlaceHolder = this.campaign.items[i].placeHolders;
  358. }
  359. }
  360. for (let i = 0; i < this.campaign.placeHolders.length; i++) {
  361. this.campaign.placeHolders[i].format = this.campaign.placeHolders[i].formatTemplate;
  362. }
  363. //console.log(JSON.stringify(this.campaign));
  364. console.log(this.passedDown);
  365. this.saveCampaign(this.campaign)
  366. .then(fulfilled => {
  367. this.$router.push("/landingPages");
  368. })
  369. .catch(error => {
  370. console.log(error.message);
  371. });
  372. } else {
  373. console.log(this.passedDown);
  374. // this.updateCampaign(this.campaign).then(() => {
  375. // this.$router.push("/landingPages");
  376. // });
  377. }
  378. },
  379. Close() {
  380. this.$router.push("/landingPages");
  381. },
  382. NewWeek() {
  383. this.$router.push("/landingPage/week/0");
  384. },
  385. onItemAdd(item) {
  386. const myList = this.campaign.placeHolders ? this.campaign.placeHolders : [];
  387. myList.push({
  388. name: item.name,
  389. boundTo: item.property,
  390. boundToClassDisplay: item.class.name,
  391. boundToClass: item.class.fullName,
  392. format: item.format,
  393. formatTemplate: item.formatTemplate
  394. });
  395. this.campaign.placeHolders = myList;
  396. this.showNew = false;
  397. },
  398. addClose() {
  399. if (this.showNew) {
  400. this.showNew = false;
  401. } else this.showNew = true;
  402. },
  403. addWeekClose() {
  404. if (this.showNewWeek) {
  405. this.showNewWeek = false;
  406. } else {
  407. this.showNewWeek = true;
  408. }
  409. },
  410. onItemDelete(item) {
  411. this.campaign.placeHolders = _.remove(this.campaign.placeHolders, x => x !== item);
  412. this.placeHolders = this.campaign.placeHolders;
  413. },
  414. // AddWeek(item) {
  415. // // const myList = this.campaign.items ? this.campaign.items : [];
  416. // // myList.push(item);
  417. // // this.campaign.items = myList;
  418. // //this.showNewWeek = false;
  419. // },
  420. AddNewWeek(week) {
  421. var item = {
  422. image: week.image,
  423. weekUni: week.week.weekUni,
  424. weekId: week.weekId,
  425. placeHolders: week.placeHolders
  426. };
  427. this.campaign.items.push(item);
  428. this.showNewWeek = false;
  429. },
  430. onItemDeleteWeek(item) {
  431. this.campaign.items = _.remove(this.campaign.items, x => x !== item);
  432. this.Weeks = this.campaign.items;
  433. },
  434. async loadData() {
  435. if (this.$route.params.id) {
  436. await this.getCampaign(this.$route.params.id);
  437. this.wait = false;
  438. if (this.$route.params.id > 0) {
  439. this.isNew = false;
  440. }
  441. } else {
  442. await this.getCampaign(0);
  443. if (this.passedDown === "0") {
  444. this.isNew = true;
  445. }
  446. }
  447. }
  448. },
  449. mounted() {
  450. this.loadData().then(() => {
  451. setTimeout(() => {
  452. this.loaded = true;
  453. }, 100);
  454. });
  455. },
  456. computed: {
  457. ...mapState("campaign", ["campaign", "campaignPlaceHolders", "campaignItems"]),
  458. checkAccess() {
  459. if (Log.getUser().role === "Super Admin" || Log.getUser().role === "Designer") {
  460. return true;
  461. } else {
  462. return false;
  463. }
  464. },
  465. CheckType() {
  466. var obj = {};
  467. if (this.campaign.id > 0) {
  468. console.log(this.campaign);
  469. if (this.campaign.isTimeshare) {
  470. obj = {
  471. fullName: "UnivateProperties_API.Model.Timeshare.TimeshareWeek",
  472. name: "TimeshareWeek"
  473. };
  474. } else {
  475. obj = {
  476. fullName: "UnivateProperties_API.Model.Properties.Property",
  477. name: "Property"
  478. };
  479. }
  480. } else {
  481. obj = {
  482. fullName: "UnivateProperties_API.Model.Timeshare.TimeshareWeek",
  483. name: "TimeshareWeek"
  484. };
  485. }
  486. return obj;
  487. },
  488. PlaceHolders() {
  489. if (this.campaign && this.campaign.placeHolders) {
  490. return this.campaign.placeHolders;
  491. }
  492. return this.placeHolders;
  493. },
  494. Weeks() {
  495. if (this.campaign && this.campaign.items) {
  496. return this.campaign.items;
  497. }
  498. return this.weeks;
  499. },
  500. CanEdit() {
  501. return this.editable || this.campaign.id === 0 || this.passedDown === "0";
  502. },
  503. CanEditWeeks() {
  504. return this.editable || this.campaign.id === 0 || this.passedDown === "0";
  505. },
  506. btnCaption() {
  507. return this.showNew ? "Close" : "New";
  508. },
  509. btnCaptionWeek() {
  510. return this.showNewWeek ? "Close" : "New";
  511. }
  512. }
  513. };
  514. </script>