85 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Vue
		
	
	
	
			
		
		
	
	
			85 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Vue
		
	
	
	
| <script>
 | |
| import { GlSprintf, GlLink } from '@gitlab/ui';
 | |
| import { __ } from '~/locale';
 | |
| import { BLOB_RENDER_ERRORS } from './constants';
 | |
| 
 | |
| export default {
 | |
|   components: {
 | |
|     GlSprintf,
 | |
|     GlLink,
 | |
|   },
 | |
|   props: {
 | |
|     viewerError: {
 | |
|       type: String,
 | |
|       required: true,
 | |
|     },
 | |
|     blob: {
 | |
|       type: Object,
 | |
|       required: false,
 | |
|       default: () => ({}),
 | |
|     },
 | |
|   },
 | |
|   computed: {
 | |
|     notStoredExternally() {
 | |
|       return this.viewerError !== BLOB_RENDER_ERRORS.REASONS.EXTERNAL.id;
 | |
|     },
 | |
|     renderErrorReason() {
 | |
|       const defaultReasonPath = Object.keys(BLOB_RENDER_ERRORS.REASONS).find(
 | |
|         (reason) => BLOB_RENDER_ERRORS.REASONS[reason].id === this.viewerError,
 | |
|       );
 | |
|       const defaultReason = BLOB_RENDER_ERRORS.REASONS[defaultReasonPath].text;
 | |
|       return this.notStoredExternally
 | |
|         ? defaultReason
 | |
|         : defaultReason[this.blob.externalStorage || 'default'];
 | |
|     },
 | |
|     renderErrorOptions() {
 | |
|       const load = {
 | |
|         ...BLOB_RENDER_ERRORS.OPTIONS.LOAD,
 | |
|         condition: this.shouldShowLoadBtn,
 | |
|       };
 | |
|       const showSource = {
 | |
|         ...BLOB_RENDER_ERRORS.OPTIONS.SHOW_SOURCE,
 | |
|         condition: this.shouldShowSourceBtn,
 | |
|       };
 | |
|       const download = {
 | |
|         ...BLOB_RENDER_ERRORS.OPTIONS.DOWNLOAD,
 | |
|         href: this.blob.rawPath,
 | |
|       };
 | |
|       return [load, showSource, download];
 | |
|     },
 | |
|     shouldShowLoadBtn() {
 | |
|       return this.viewerError === BLOB_RENDER_ERRORS.REASONS.COLLAPSED.id;
 | |
|     },
 | |
|     shouldShowSourceBtn() {
 | |
|       return this.blob.richViewer && this.blob.renderedAsText && this.notStoredExternally;
 | |
|     },
 | |
|   },
 | |
|   errorMessage: __(
 | |
|     'This content could not be displayed because %{reason}. You can %{options} instead.',
 | |
|   ),
 | |
| };
 | |
| </script>
 | |
| <template>
 | |
|   <div class="file-content code">
 | |
|     <div class="text-center py-4">
 | |
|       <gl-sprintf :message="$options.errorMessage">
 | |
|         <template #reason>{{ renderErrorReason }}</template>
 | |
|         <template #options>
 | |
|           <template v-for="option in renderErrorOptions">
 | |
|             <span v-if="option.condition" :key="option.text">
 | |
|               <gl-link
 | |
|                 :href="option.href"
 | |
|                 :target="option.target"
 | |
|                 :data-test-id="`option-${option.id}`"
 | |
|                 @click="option.event && $emit(option.event)"
 | |
|                 >{{ option.text }}</gl-link
 | |
|               >
 | |
|               {{ option.conjunction }}
 | |
|             </span>
 | |
|           </template>
 | |
|         </template>
 | |
|       </gl-sprintf>
 | |
|     </div>
 | |
|   </div>
 | |
| </template>
 |