执行过npm install命令的vue-element-admin源码
康凯
2022-05-20 aa4c235a8ca67ea8b731f90c951a465e92c0a865
1
{"remainingRequest":"D:\\源码\\vue-element-admin-master\\node_modules\\vue-loader\\lib\\index.js??vue-loader-options!D:\\源码\\vue-element-admin-master\\src\\views\\table\\complex-table.vue?vue&type=script&lang=js&","dependencies":[{"path":"D:\\源码\\vue-element-admin-master\\src\\views\\table\\complex-table.vue","mtime":1649647926000},{"path":"D:\\源码\\vue-element-admin-master\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\源码\\vue-element-admin-master\\node_modules\\babel-loader\\lib\\index.js","mtime":315532800000},{"path":"D:\\源码\\vue-element-admin-master\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\源码\\vue-element-admin-master\\node_modules\\vue-loader\\lib\\index.js","mtime":499162500000}],"contextDependencies":[],"result":[{"type":"Buffer","data":"base64:Ly8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KCmltcG9ydCB7IGZldGNoTGlzdCwgZmV0Y2hQdiwgY3JlYXRlQXJ0aWNsZSwgdXBkYXRlQXJ0aWNsZSB9IGZyb20gJ0AvYXBpL2FydGljbGUnCmltcG9ydCB3YXZlcyBmcm9tICdAL2RpcmVjdGl2ZS93YXZlcycgLy8gd2F2ZXMgZGlyZWN0aXZlCmltcG9ydCB7IHBhcnNlVGltZSB9IGZyb20gJ0AvdXRpbHMnCmltcG9ydCBQYWdpbmF0aW9uIGZyb20gJ0AvY29tcG9uZW50cy9QYWdpbmF0aW9uJyAvLyBzZWNvbmRhcnkgcGFja2FnZSBiYXNlZCBvbiBlbC1wYWdpbmF0aW9uCgpjb25zdCBjYWxlbmRhclR5cGVPcHRpb25zID0gWwogIHsga2V5OiAnQ04nLCBkaXNwbGF5X25hbWU6ICdDaGluYScgfSwKICB7IGtleTogJ1VTJywgZGlzcGxheV9uYW1lOiAnVVNBJyB9LAogIHsga2V5OiAnSlAnLCBkaXNwbGF5X25hbWU6ICdKYXBhbicgfSwKICB7IGtleTogJ0VVJywgZGlzcGxheV9uYW1lOiAnRXVyb3pvbmUnIH0KXQoKLy8gYXJyIHRvIG9iaiwgc3VjaCBhcyB7IENOIDogIkNoaW5hIiwgVVMgOiAiVVNBIiB9CmNvbnN0IGNhbGVuZGFyVHlwZUtleVZhbHVlID0gY2FsZW5kYXJUeXBlT3B0aW9ucy5yZWR1Y2UoKGFjYywgY3VyKSA9PiB7CiAgYWNjW2N1ci5rZXldID0gY3VyLmRpc3BsYXlfbmFtZQogIHJldHVybiBhY2MKfSwge30pCgpleHBvcnQgZGVmYXVsdCB7CiAgbmFtZTogJ0NvbXBsZXhUYWJsZScsCiAgY29tcG9uZW50czogeyBQYWdpbmF0aW9uIH0sCiAgZGlyZWN0aXZlczogeyB3YXZlcyB9LAogIGZpbHRlcnM6IHsKICAgIHN0YXR1c0ZpbHRlcihzdGF0dXMpIHsKICAgICAgY29uc3Qgc3RhdHVzTWFwID0gewogICAgICAgIHB1Ymxpc2hlZDogJ3N1Y2Nlc3MnLAogICAgICAgIGRyYWZ0OiAnaW5mbycsCiAgICAgICAgZGVsZXRlZDogJ2RhbmdlcicKICAgICAgfQogICAgICByZXR1cm4gc3RhdHVzTWFwW3N0YXR1c10KICAgIH0sCiAgICB0eXBlRmlsdGVyKHR5cGUpIHsKICAgICAgcmV0dXJuIGNhbGVuZGFyVHlwZUtleVZhbHVlW3R5cGVdCiAgICB9CiAgfSwKICBkYXRhKCkgewogICAgcmV0dXJuIHsKICAgICAgdGFibGVLZXk6IDAsCiAgICAgIGxpc3Q6IG51bGwsCiAgICAgIHRvdGFsOiAwLAogICAgICBsaXN0TG9hZGluZzogdHJ1ZSwKICAgICAgbGlzdFF1ZXJ5OiB7CiAgICAgICAgcGFnZTogMSwKICAgICAgICBsaW1pdDogMjAsCiAgICAgICAgaW1wb3J0YW5jZTogdW5kZWZpbmVkLAogICAgICAgIHRpdGxlOiB1bmRlZmluZWQsCiAgICAgICAgdHlwZTogdW5kZWZpbmVkLAogICAgICAgIHNvcnQ6ICcraWQnCiAgICAgIH0sCiAgICAgIGltcG9ydGFuY2VPcHRpb25zOiBbMSwgMiwgM10sCiAgICAgIGNhbGVuZGFyVHlwZU9wdGlvbnMsCiAgICAgIHNvcnRPcHRpb25zOiBbeyBsYWJlbDogJ0lEIEFzY2VuZGluZycsIGtleTogJytpZCcgfSwgeyBsYWJlbDogJ0lEIERlc2NlbmRpbmcnLCBrZXk6ICctaWQnIH1dLAogICAgICBzdGF0dXNPcHRpb25zOiBbJ3B1Ymxpc2hlZCcsICdkcmFmdCcsICdkZWxldGVkJ10sCiAgICAgIHNob3dSZXZpZXdlcjogZmFsc2UsCiAgICAgIHRlbXA6IHsKICAgICAgICBpZDogdW5kZWZpbmVkLAogICAgICAgIGltcG9ydGFuY2U6IDEsCiAgICAgICAgcmVtYXJrOiAnJywKICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCksCiAgICAgICAgdGl0bGU6ICcnLAogICAgICAgIHR5cGU6ICcnLAogICAgICAgIHN0YXR1czogJ3B1Ymxpc2hlZCcKICAgICAgfSwKICAgICAgZGlhbG9nRm9ybVZpc2libGU6IGZhbHNlLAogICAgICBkaWFsb2dTdGF0dXM6ICcnLAogICAgICB0ZXh0TWFwOiB7CiAgICAgICAgdXBkYXRlOiAnRWRpdCcsCiAgICAgICAgY3JlYXRlOiAnQ3JlYXRlJwogICAgICB9LAogICAgICBkaWFsb2dQdlZpc2libGU6IGZhbHNlLAogICAgICBwdkRhdGE6IFtdLAogICAgICBydWxlczogewogICAgICAgIHR5cGU6IFt7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAndHlwZSBpcyByZXF1aXJlZCcsIHRyaWdnZXI6ICdjaGFuZ2UnIH1dLAogICAgICAgIHRpbWVzdGFtcDogW3sgdHlwZTogJ2RhdGUnLCByZXF1aXJlZDogdHJ1ZSwgbWVzc2FnZTogJ3RpbWVzdGFtcCBpcyByZXF1aXJlZCcsIHRyaWdnZXI6ICdjaGFuZ2UnIH1dLAogICAgICAgIHRpdGxlOiBbeyByZXF1aXJlZDogdHJ1ZSwgbWVzc2FnZTogJ3RpdGxlIGlzIHJlcXVpcmVkJywgdHJpZ2dlcjogJ2JsdXInIH1dCiAgICAgIH0sCiAgICAgIGRvd25sb2FkTG9hZGluZzogZmFsc2UKICAgIH0KICB9LAogIGNyZWF0ZWQoKSB7CiAgICB0aGlzLmdldExpc3QoKQogIH0sCiAgbWV0aG9kczogewogICAgZ2V0TGlzdCgpIHsKICAgICAgdGhpcy5saXN0TG9hZGluZyA9IHRydWUKICAgICAgZmV0Y2hMaXN0KHRoaXMubGlzdFF1ZXJ5KS50aGVuKHJlc3BvbnNlID0+IHsKICAgICAgICB0aGlzLmxpc3QgPSByZXNwb25zZS5kYXRhLml0ZW1zCiAgICAgICAgdGhpcy50b3RhbCA9IHJlc3BvbnNlLmRhdGEudG90YWwKCiAgICAgICAgLy8gSnVzdCB0byBzaW11bGF0ZSB0aGUgdGltZSBvZiB0aGUgcmVxdWVzdAogICAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgdGhpcy5saXN0TG9hZGluZyA9IGZhbHNlCiAgICAgICAgfSwgMS41ICogMTAwMCkKICAgICAgfSkKICAgIH0sCiAgICBoYW5kbGVGaWx0ZXIoKSB7CiAgICAgIHRoaXMubGlzdFF1ZXJ5LnBhZ2UgPSAxCiAgICAgIHRoaXMuZ2V0TGlzdCgpCiAgICB9LAogICAgaGFuZGxlTW9kaWZ5U3RhdHVzKHJvdywgc3RhdHVzKSB7CiAgICAgIHRoaXMuJG1lc3NhZ2UoewogICAgICAgIG1lc3NhZ2U6ICfmk43kvZxTdWNjZXNzJywKICAgICAgICB0eXBlOiAnc3VjY2VzcycKICAgICAgfSkKICAgICAgcm93LnN0YXR1cyA9IHN0YXR1cwogICAgfSwKICAgIHNvcnRDaGFuZ2UoZGF0YSkgewogICAgICBjb25zdCB7IHByb3AsIG9yZGVyIH0gPSBkYXRhCiAgICAgIGlmIChwcm9wID09PSAnaWQnKSB7CiAgICAgICAgdGhpcy5zb3J0QnlJRChvcmRlcikKICAgICAgfQogICAgfSwKICAgIHNvcnRCeUlEKG9yZGVyKSB7CiAgICAgIGlmIChvcmRlciA9PT0gJ2FzY2VuZGluZycpIHsKICAgICAgICB0aGlzLmxpc3RRdWVyeS5zb3J0ID0gJytpZCcKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLmxpc3RRdWVyeS5zb3J0ID0gJy1pZCcKICAgICAgfQogICAgICB0aGlzLmhhbmRsZUZpbHRlcigpCiAgICB9LAogICAgcmVzZXRUZW1wKCkgewogICAgICB0aGlzLnRlbXAgPSB7CiAgICAgICAgaWQ6IHVuZGVmaW5lZCwKICAgICAgICBpbXBvcnRhbmNlOiAxLAogICAgICAgIHJlbWFyazogJycsCiAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLAogICAgICAgIHRpdGxlOiAnJywKICAgICAgICBzdGF0dXM6ICdwdWJsaXNoZWQnLAogICAgICAgIHR5cGU6ICcnCiAgICAgIH0KICAgIH0sCiAgICBoYW5kbGVDcmVhdGUoKSB7CiAgICAgIHRoaXMucmVzZXRUZW1wKCkKICAgICAgdGhpcy5kaWFsb2dTdGF0dXMgPSAnY3JlYXRlJwogICAgICB0aGlzLmRpYWxvZ0Zvcm1WaXNpYmxlID0gdHJ1ZQogICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiB7CiAgICAgICAgdGhpcy4kcmVmc1snZGF0YUZvcm0nXS5jbGVhclZhbGlkYXRlKCkKICAgICAgfSkKICAgIH0sCiAgICBjcmVhdGVEYXRhKCkgewogICAgICB0aGlzLiRyZWZzWydkYXRhRm9ybSddLnZhbGlkYXRlKCh2YWxpZCkgPT4gewogICAgICAgIGlmICh2YWxpZCkgewogICAgICAgICAgdGhpcy50ZW1wLmlkID0gcGFyc2VJbnQoTWF0aC5yYW5kb20oKSAqIDEwMCkgKyAxMDI0IC8vIG1vY2sgYSBpZAogICAgICAgICAgdGhpcy50ZW1wLmF1dGhvciA9ICd2dWUtZWxlbWVudC1hZG1pbicKICAgICAgICAgIGNyZWF0ZUFydGljbGUodGhpcy50ZW1wKS50aGVuKCgpID0+IHsKICAgICAgICAgICAgdGhpcy5saXN0LnVuc2hpZnQodGhpcy50ZW1wKQogICAgICAgICAgICB0aGlzLmRpYWxvZ0Zvcm1WaXNpYmxlID0gZmFsc2UKICAgICAgICAgICAgdGhpcy4kbm90aWZ5KHsKICAgICAgICAgICAgICB0aXRsZTogJ1N1Y2Nlc3MnLAogICAgICAgICAgICAgIG1lc3NhZ2U6ICdDcmVhdGVkIFN1Y2Nlc3NmdWxseScsCiAgICAgICAgICAgICAgdHlwZTogJ3N1Y2Nlc3MnLAogICAgICAgICAgICAgIGR1cmF0aW9uOiAyMDAwCiAgICAgICAgICAgIH0pCiAgICAgICAgICB9KQogICAgICAgIH0KICAgICAgfSkKICAgIH0sCiAgICBoYW5kbGVVcGRhdGUocm93KSB7CiAgICAgIHRoaXMudGVtcCA9IE9iamVjdC5hc3NpZ24oe30sIHJvdykgLy8gY29weSBvYmoKICAgICAgdGhpcy50ZW1wLnRpbWVzdGFtcCA9IG5ldyBEYXRlKHRoaXMudGVtcC50aW1lc3RhbXApCiAgICAgIHRoaXMuZGlhbG9nU3RhdHVzID0gJ3VwZGF0ZScKICAgICAgdGhpcy5kaWFsb2dGb3JtVmlzaWJsZSA9IHRydWUKICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4gewogICAgICAgIHRoaXMuJHJlZnNbJ2RhdGFGb3JtJ10uY2xlYXJWYWxpZGF0ZSgpCiAgICAgIH0pCiAgICB9LAogICAgdXBkYXRlRGF0YSgpIHsKICAgICAgdGhpcy4kcmVmc1snZGF0YUZvcm0nXS52YWxpZGF0ZSgodmFsaWQpID0+IHsKICAgICAgICBpZiAodmFsaWQpIHsKICAgICAgICAgIGNvbnN0IHRlbXBEYXRhID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy50ZW1wKQogICAgICAgICAgdGVtcERhdGEudGltZXN0YW1wID0gK25ldyBEYXRlKHRlbXBEYXRhLnRpbWVzdGFtcCkgLy8gY2hhbmdlIFRodSBOb3YgMzAgMjAxNyAxNjo0MTowNSBHTVQrMDgwMCAoQ1NUKSB0byAxNTEyMDMxMzExNDY0CiAgICAgICAgICB1cGRhdGVBcnRpY2xlKHRlbXBEYXRhKS50aGVuKCgpID0+IHsKICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmxpc3QuZmluZEluZGV4KHYgPT4gdi5pZCA9PT0gdGhpcy50ZW1wLmlkKQogICAgICAgICAgICB0aGlzLmxpc3Quc3BsaWNlKGluZGV4LCAxLCB0aGlzLnRlbXApCiAgICAgICAgICAgIHRoaXMuZGlhbG9nRm9ybVZpc2libGUgPSBmYWxzZQogICAgICAgICAgICB0aGlzLiRub3RpZnkoewogICAgICAgICAgICAgIHRpdGxlOiAnU3VjY2VzcycsCiAgICAgICAgICAgICAgbWVzc2FnZTogJ1VwZGF0ZSBTdWNjZXNzZnVsbHknLAogICAgICAgICAgICAgIHR5cGU6ICdzdWNjZXNzJywKICAgICAgICAgICAgICBkdXJhdGlvbjogMjAwMAogICAgICAgICAgICB9KQogICAgICAgICAgfSkKICAgICAgICB9CiAgICAgIH0pCiAgICB9LAogICAgaGFuZGxlRGVsZXRlKHJvdywgaW5kZXgpIHsKICAgICAgdGhpcy4kbm90aWZ5KHsKICAgICAgICB0aXRsZTogJ1N1Y2Nlc3MnLAogICAgICAgIG1lc3NhZ2U6ICdEZWxldGUgU3VjY2Vzc2Z1bGx5JywKICAgICAgICB0eXBlOiAnc3VjY2VzcycsCiAgICAgICAgZHVyYXRpb246IDIwMDAKICAgICAgfSkKICAgICAgdGhpcy5saXN0LnNwbGljZShpbmRleCwgMSkKICAgIH0sCiAgICBoYW5kbGVGZXRjaFB2KHB2KSB7CiAgICAgIGZldGNoUHYocHYpLnRoZW4ocmVzcG9uc2UgPT4gewogICAgICAgIHRoaXMucHZEYXRhID0gcmVzcG9uc2UuZGF0YS5wdkRhdGEKICAgICAgICB0aGlzLmRpYWxvZ1B2VmlzaWJsZSA9IHRydWUKICAgICAgfSkKICAgIH0sCiAgICBoYW5kbGVEb3dubG9hZCgpIHsKICAgICAgdGhpcy5kb3dubG9hZExvYWRpbmcgPSB0cnVlCiAgICAgIGltcG9ydCgnQC92ZW5kb3IvRXhwb3J0MkV4Y2VsJykudGhlbihleGNlbCA9PiB7CiAgICAgICAgY29uc3QgdEhlYWRlciA9IFsndGltZXN0YW1wJywgJ3RpdGxlJywgJ3R5cGUnLCAnaW1wb3J0YW5jZScsICdzdGF0dXMnXQogICAgICAgIGNvbnN0IGZpbHRlclZhbCA9IFsndGltZXN0YW1wJywgJ3RpdGxlJywgJ3R5cGUnLCAnaW1wb3J0YW5jZScsICdzdGF0dXMnXQogICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmZvcm1hdEpzb24oZmlsdGVyVmFsKQogICAgICAgIGV4Y2VsLmV4cG9ydF9qc29uX3RvX2V4Y2VsKHsKICAgICAgICAgIGhlYWRlcjogdEhlYWRlciwKICAgICAgICAgIGRhdGEsCiAgICAgICAgICBmaWxlbmFtZTogJ3RhYmxlLWxpc3QnCiAgICAgICAgfSkKICAgICAgICB0aGlzLmRvd25sb2FkTG9hZGluZyA9IGZhbHNlCiAgICAgIH0pCiAgICB9LAogICAgZm9ybWF0SnNvbihmaWx0ZXJWYWwpIHsKICAgICAgcmV0dXJuIHRoaXMubGlzdC5tYXAodiA9PiBmaWx0ZXJWYWwubWFwKGogPT4gewogICAgICAgIGlmIChqID09PSAndGltZXN0YW1wJykgewogICAgICAgICAgcmV0dXJuIHBhcnNlVGltZSh2W2pdKQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gdltqXQogICAgICAgIH0KICAgICAgfSkpCiAgICB9LAogICAgZ2V0U29ydENsYXNzOiBmdW5jdGlvbihrZXkpIHsKICAgICAgY29uc3Qgc29ydCA9IHRoaXMubGlzdFF1ZXJ5LnNvcnQKICAgICAgcmV0dXJuIHNvcnQgPT09IGArJHtrZXl9YCA/ICdhc2NlbmRpbmcnIDogJ2Rlc2NlbmRpbmcnCiAgICB9CiAgfQp9Cg=="},{"version":3,"sources":["complex-table.vue"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqJA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"complex-table.vue","sourceRoot":"src/views/table","sourcesContent":["<template>\n  <div class=\"app-container\">\n    <div class=\"filter-container\">\n      <el-input v-model=\"listQuery.title\" placeholder=\"Title\" style=\"width: 200px;\" class=\"filter-item\" @keyup.enter.native=\"handleFilter\" />\n      <el-select v-model=\"listQuery.importance\" placeholder=\"Imp\" clearable style=\"width: 90px\" class=\"filter-item\">\n        <el-option v-for=\"item in importanceOptions\" :key=\"item\" :label=\"item\" :value=\"item\" />\n      </el-select>\n      <el-select v-model=\"listQuery.type\" placeholder=\"Type\" clearable class=\"filter-item\" style=\"width: 130px\">\n        <el-option v-for=\"item in calendarTypeOptions\" :key=\"item.key\" :label=\"item.display_name+'('+item.key+')'\" :value=\"item.key\" />\n      </el-select>\n      <el-select v-model=\"listQuery.sort\" style=\"width: 140px\" class=\"filter-item\" @change=\"handleFilter\">\n        <el-option v-for=\"item in sortOptions\" :key=\"item.key\" :label=\"item.label\" :value=\"item.key\" />\n      </el-select>\n      <el-button v-waves class=\"filter-item\" type=\"primary\" icon=\"el-icon-search\" @click=\"handleFilter\">\n        Search\n      </el-button>\n      <el-button class=\"filter-item\" style=\"margin-left: 10px;\" type=\"primary\" icon=\"el-icon-edit\" @click=\"handleCreate\">\n        Add\n      </el-button>\n      <el-button v-waves :loading=\"downloadLoading\" class=\"filter-item\" type=\"primary\" icon=\"el-icon-download\" @click=\"handleDownload\">\n        Export\n      </el-button>\n      <el-checkbox v-model=\"showReviewer\" class=\"filter-item\" style=\"margin-left:15px;\" @change=\"tableKey=tableKey+1\">\n        reviewer\n      </el-checkbox>\n    </div>\n\n    <el-table\n      :key=\"tableKey\"\n      v-loading=\"listLoading\"\n      :data=\"list\"\n      border\n      fit\n      highlight-current-row\n      style=\"width: 100%;\"\n      @sort-change=\"sortChange\"\n    >\n      <el-table-column label=\"ID\" prop=\"id\" sortable=\"custom\" align=\"center\" width=\"80\" :class-name=\"getSortClass('id')\">\n        <template slot-scope=\"{row}\">\n          <span>{{ row.id }}</span>\n        </template>\n      </el-table-column>\n      <el-table-column label=\"Date\" width=\"150px\" align=\"center\">\n        <template slot-scope=\"{row}\">\n          <span>{{ row.timestamp | parseTime('{y}-{m}-{d} {h}:{i}') }}</span>\n        </template>\n      </el-table-column>\n      <el-table-column label=\"Title\" min-width=\"150px\">\n        <template slot-scope=\"{row}\">\n          <span class=\"link-type\" @click=\"handleUpdate(row)\">{{ row.title }}</span>\n          <el-tag>{{ row.type | typeFilter }}</el-tag>\n        </template>\n      </el-table-column>\n      <el-table-column label=\"Author\" width=\"110px\" align=\"center\">\n        <template slot-scope=\"{row}\">\n          <span>{{ row.author }}</span>\n        </template>\n      </el-table-column>\n      <el-table-column v-if=\"showReviewer\" label=\"Reviewer\" width=\"110px\" align=\"center\">\n        <template slot-scope=\"{row}\">\n          <span style=\"color:red;\">{{ row.reviewer }}</span>\n        </template>\n      </el-table-column>\n      <el-table-column label=\"Imp\" width=\"80px\">\n        <template slot-scope=\"{row}\">\n          <svg-icon v-for=\"n in + row.importance\" :key=\"n\" icon-class=\"star\" class=\"meta-item__icon\" />\n        </template>\n      </el-table-column>\n      <el-table-column label=\"Readings\" align=\"center\" width=\"95\">\n        <template slot-scope=\"{row}\">\n          <span v-if=\"row.pageviews\" class=\"link-type\" @click=\"handleFetchPv(row.pageviews)\">{{ row.pageviews }}</span>\n          <span v-else>0</span>\n        </template>\n      </el-table-column>\n      <el-table-column label=\"Status\" class-name=\"status-col\" width=\"100\">\n        <template slot-scope=\"{row}\">\n          <el-tag :type=\"row.status | statusFilter\">\n            {{ row.status }}\n          </el-tag>\n        </template>\n      </el-table-column>\n      <el-table-column label=\"Actions\" align=\"center\" width=\"230\" class-name=\"small-padding fixed-width\">\n        <template slot-scope=\"{row,$index}\">\n          <el-button type=\"primary\" size=\"mini\" @click=\"handleUpdate(row)\">\n            Edit\n          </el-button>\n          <el-button v-if=\"row.status!='published'\" size=\"mini\" type=\"success\" @click=\"handleModifyStatus(row,'published')\">\n            Publish\n          </el-button>\n          <el-button v-if=\"row.status!='draft'\" size=\"mini\" @click=\"handleModifyStatus(row,'draft')\">\n            Draft\n          </el-button>\n          <el-button v-if=\"row.status!='deleted'\" size=\"mini\" type=\"danger\" @click=\"handleDelete(row,$index)\">\n            Delete\n          </el-button>\n        </template>\n      </el-table-column>\n    </el-table>\n\n    <pagination v-show=\"total>0\" :total=\"total\" :page.sync=\"listQuery.page\" :limit.sync=\"listQuery.limit\" @pagination=\"getList\" />\n\n    <el-dialog :title=\"textMap[dialogStatus]\" :visible.sync=\"dialogFormVisible\">\n      <el-form ref=\"dataForm\" :rules=\"rules\" :model=\"temp\" label-position=\"left\" label-width=\"70px\" style=\"width: 400px; margin-left:50px;\">\n        <el-form-item label=\"Type\" prop=\"type\">\n          <el-select v-model=\"temp.type\" class=\"filter-item\" placeholder=\"Please select\">\n            <el-option v-for=\"item in calendarTypeOptions\" :key=\"item.key\" :label=\"item.display_name\" :value=\"item.key\" />\n          </el-select>\n        </el-form-item>\n        <el-form-item label=\"Date\" prop=\"timestamp\">\n          <el-date-picker v-model=\"temp.timestamp\" type=\"datetime\" placeholder=\"Please pick a date\" />\n        </el-form-item>\n        <el-form-item label=\"Title\" prop=\"title\">\n          <el-input v-model=\"temp.title\" />\n        </el-form-item>\n        <el-form-item label=\"Status\">\n          <el-select v-model=\"temp.status\" class=\"filter-item\" placeholder=\"Please select\">\n            <el-option v-for=\"item in statusOptions\" :key=\"item\" :label=\"item\" :value=\"item\" />\n          </el-select>\n        </el-form-item>\n        <el-form-item label=\"Imp\">\n          <el-rate v-model=\"temp.importance\" :colors=\"['#99A9BF', '#F7BA2A', '#FF9900']\" :max=\"3\" style=\"margin-top:8px;\" />\n        </el-form-item>\n        <el-form-item label=\"Remark\">\n          <el-input v-model=\"temp.remark\" :autosize=\"{ minRows: 2, maxRows: 4}\" type=\"textarea\" placeholder=\"Please input\" />\n        </el-form-item>\n      </el-form>\n      <div slot=\"footer\" class=\"dialog-footer\">\n        <el-button @click=\"dialogFormVisible = false\">\n          Cancel\n        </el-button>\n        <el-button type=\"primary\" @click=\"dialogStatus==='create'?createData():updateData()\">\n          Confirm\n        </el-button>\n      </div>\n    </el-dialog>\n\n    <el-dialog :visible.sync=\"dialogPvVisible\" title=\"Reading statistics\">\n      <el-table :data=\"pvData\" border fit highlight-current-row style=\"width: 100%\">\n        <el-table-column prop=\"key\" label=\"Channel\" />\n        <el-table-column prop=\"pv\" label=\"Pv\" />\n      </el-table>\n      <span slot=\"footer\" class=\"dialog-footer\">\n        <el-button type=\"primary\" @click=\"dialogPvVisible = false\">Confirm</el-button>\n      </span>\n    </el-dialog>\n  </div>\n</template>\n\n<script>\nimport { fetchList, fetchPv, createArticle, updateArticle } from '@/api/article'\nimport waves from '@/directive/waves' // waves directive\nimport { parseTime } from '@/utils'\nimport Pagination from '@/components/Pagination' // secondary package based on el-pagination\n\nconst calendarTypeOptions = [\n  { key: 'CN', display_name: 'China' },\n  { key: 'US', display_name: 'USA' },\n  { key: 'JP', display_name: 'Japan' },\n  { key: 'EU', display_name: 'Eurozone' }\n]\n\n// arr to obj, such as { CN : \"China\", US : \"USA\" }\nconst calendarTypeKeyValue = calendarTypeOptions.reduce((acc, cur) => {\n  acc[cur.key] = cur.display_name\n  return acc\n}, {})\n\nexport default {\n  name: 'ComplexTable',\n  components: { Pagination },\n  directives: { waves },\n  filters: {\n    statusFilter(status) {\n      const statusMap = {\n        published: 'success',\n        draft: 'info',\n        deleted: 'danger'\n      }\n      return statusMap[status]\n    },\n    typeFilter(type) {\n      return calendarTypeKeyValue[type]\n    }\n  },\n  data() {\n    return {\n      tableKey: 0,\n      list: null,\n      total: 0,\n      listLoading: true,\n      listQuery: {\n        page: 1,\n        limit: 20,\n        importance: undefined,\n        title: undefined,\n        type: undefined,\n        sort: '+id'\n      },\n      importanceOptions: [1, 2, 3],\n      calendarTypeOptions,\n      sortOptions: [{ label: 'ID Ascending', key: '+id' }, { label: 'ID Descending', key: '-id' }],\n      statusOptions: ['published', 'draft', 'deleted'],\n      showReviewer: false,\n      temp: {\n        id: undefined,\n        importance: 1,\n        remark: '',\n        timestamp: new Date(),\n        title: '',\n        type: '',\n        status: 'published'\n      },\n      dialogFormVisible: false,\n      dialogStatus: '',\n      textMap: {\n        update: 'Edit',\n        create: 'Create'\n      },\n      dialogPvVisible: false,\n      pvData: [],\n      rules: {\n        type: [{ required: true, message: 'type is required', trigger: 'change' }],\n        timestamp: [{ type: 'date', required: true, message: 'timestamp is required', trigger: 'change' }],\n        title: [{ required: true, message: 'title is required', trigger: 'blur' }]\n      },\n      downloadLoading: false\n    }\n  },\n  created() {\n    this.getList()\n  },\n  methods: {\n    getList() {\n      this.listLoading = true\n      fetchList(this.listQuery).then(response => {\n        this.list = response.data.items\n        this.total = response.data.total\n\n        // Just to simulate the time of the request\n        setTimeout(() => {\n          this.listLoading = false\n        }, 1.5 * 1000)\n      })\n    },\n    handleFilter() {\n      this.listQuery.page = 1\n      this.getList()\n    },\n    handleModifyStatus(row, status) {\n      this.$message({\n        message: '操作Success',\n        type: 'success'\n      })\n      row.status = status\n    },\n    sortChange(data) {\n      const { prop, order } = data\n      if (prop === 'id') {\n        this.sortByID(order)\n      }\n    },\n    sortByID(order) {\n      if (order === 'ascending') {\n        this.listQuery.sort = '+id'\n      } else {\n        this.listQuery.sort = '-id'\n      }\n      this.handleFilter()\n    },\n    resetTemp() {\n      this.temp = {\n        id: undefined,\n        importance: 1,\n        remark: '',\n        timestamp: new Date(),\n        title: '',\n        status: 'published',\n        type: ''\n      }\n    },\n    handleCreate() {\n      this.resetTemp()\n      this.dialogStatus = 'create'\n      this.dialogFormVisible = true\n      this.$nextTick(() => {\n        this.$refs['dataForm'].clearValidate()\n      })\n    },\n    createData() {\n      this.$refs['dataForm'].validate((valid) => {\n        if (valid) {\n          this.temp.id = parseInt(Math.random() * 100) + 1024 // mock a id\n          this.temp.author = 'vue-element-admin'\n          createArticle(this.temp).then(() => {\n            this.list.unshift(this.temp)\n            this.dialogFormVisible = false\n            this.$notify({\n              title: 'Success',\n              message: 'Created Successfully',\n              type: 'success',\n              duration: 2000\n            })\n          })\n        }\n      })\n    },\n    handleUpdate(row) {\n      this.temp = Object.assign({}, row) // copy obj\n      this.temp.timestamp = new Date(this.temp.timestamp)\n      this.dialogStatus = 'update'\n      this.dialogFormVisible = true\n      this.$nextTick(() => {\n        this.$refs['dataForm'].clearValidate()\n      })\n    },\n    updateData() {\n      this.$refs['dataForm'].validate((valid) => {\n        if (valid) {\n          const tempData = Object.assign({}, this.temp)\n          tempData.timestamp = +new Date(tempData.timestamp) // change Thu Nov 30 2017 16:41:05 GMT+0800 (CST) to 1512031311464\n          updateArticle(tempData).then(() => {\n            const index = this.list.findIndex(v => v.id === this.temp.id)\n            this.list.splice(index, 1, this.temp)\n            this.dialogFormVisible = false\n            this.$notify({\n              title: 'Success',\n              message: 'Update Successfully',\n              type: 'success',\n              duration: 2000\n            })\n          })\n        }\n      })\n    },\n    handleDelete(row, index) {\n      this.$notify({\n        title: 'Success',\n        message: 'Delete Successfully',\n        type: 'success',\n        duration: 2000\n      })\n      this.list.splice(index, 1)\n    },\n    handleFetchPv(pv) {\n      fetchPv(pv).then(response => {\n        this.pvData = response.data.pvData\n        this.dialogPvVisible = true\n      })\n    },\n    handleDownload() {\n      this.downloadLoading = true\n      import('@/vendor/Export2Excel').then(excel => {\n        const tHeader = ['timestamp', 'title', 'type', 'importance', 'status']\n        const filterVal = ['timestamp', 'title', 'type', 'importance', 'status']\n        const data = this.formatJson(filterVal)\n        excel.export_json_to_excel({\n          header: tHeader,\n          data,\n          filename: 'table-list'\n        })\n        this.downloadLoading = false\n      })\n    },\n    formatJson(filterVal) {\n      return this.list.map(v => filterVal.map(j => {\n        if (j === 'timestamp') {\n          return parseTime(v[j])\n        } else {\n          return v[j]\n        }\n      }))\n    },\n    getSortClass: function(key) {\n      const sort = this.listQuery.sort\n      return sort === `+${key}` ? 'ascending' : 'descending'\n    }\n  }\n}\n</script>\n"]}]}