Vue component returning multiple table rows - html

I'm attempting to return two tr elements from a single component v-design-row. I know vue requires the template elements to be wrapped in a div, but I cannot wrap them in a div because of the tag structure html tables require. When I add the second tr in the v-design-row component then vue doesn't render anything.
Can anyone suggest the best method for accomplishing this?
main.vue
<table class="table">
<thead>
<th>Image</th>
<th>Name</th>
<th>Description</th>
<th>Status</th>
<th>Order</th>
<th>Edit</th>
<th>Delete</th>
</thead>
<tbody v-for="catagory in catagories">
<v-catagory-row :catagory="catagory"></v-catagory-row>
<v-design-row v-for="design in catagory.designs" :design="design"></v-design-row>
</tbody>
</table>
v-design-row.vue
<template>
<tr>
<td><img :src="design.image_directory" :alt="design.name"></td>
<td>{{ design.name }}</td>
<td>
<button class="btn btn-secondary" type="button" data-toggle="collapse" :data-target="'#' + design.identifier" aria-expanded="false" :aria-controls="design.identifier">
<i class="fa fa-plus" aria-hidden="true"></i> Show
</button>
</td>
<td>
<div class="switch">
<input :id="'active'+design.id" v-model="design.active" class="btn-toggle btn-toggle-round-flat" type="checkbox">
<label :for="'active'+design.id"></label>
</div>
</td>
<td>
<button class="btn btn-secondary" type="button">
<i class="fa fa-caret-up" aria-hidden="true"></i>
</button>
<button class="btn btn-secondary" type="button">
<i class="fa fa-caret-down" aria-hidden="true"></i>
</button>
{{ design.sort_order }}
</td>
<td>
<button class="btn btn-secondary" type="button">
<i class="fa fa-pencil" aria-hidden="true"></i>
</button>
</td>
<td>
<button class="btn btn-secondary" type="button">
<i class="fa fa-trash" aria-hidden="true"></i>
</button>
</td>
</tr>
<tr>
<td class="p-0" colspan="7">
<div class="collapse" :id="design.identifier">
<div class="p-3">
{{ design.description }}
</div>
</div>
</td>
</tr>
</template>

You are allowed to group row using multiple <tbody> sections like this:
<table>
<thead>
<tr> ... </tr>
</thead>
<tbody>
<tr> ... </tr>
<tr> ... </tr>
</tbody>
<tbody>
<tr> ... </tr>
<tr> ... </tr>
</tbody>
</table>
You can use this in templates by using a <tbody> as the root element:
<template>
<tbody>
<tr> ... </tr>
<tr> ... </tr>
</tbody>
</template>

Since second tr in your v-design-row contains description of design, I'd suggest that this is whole element and it should occupy one row and have its own layout.
Alternatively, you can have a description separately and all other data in component.
Also, statement
vue requires the template elements to be wrapped in a div
is not quite correct. Template can have any root element while it is a single element. So you can have
<template>
<tr>
</tr>
</template>
or even
<template>
<tr v-if="condition == 1">
</tr>
<tr v-else-if="condition == 2">
</tr>
<tr v-else>
</tr>
</template>

You can use vue-fragment library. It allows you to have wrapper that wont actually be rendered.
https://www.npmjs.com/package/vue-fragment

Related

How to make a Table using Json with images on top

I don't know how to put this in order to look the same table, I understand I need to code in base64 the images, but I don't know how to put those images in the json in order to shown the same way.
<div class="pt-3">
<table>
<tr>
<td><img src="https://d1yjjnpx0p53s8.cloudfront.net/styles/logo-thumbnail/s3/062013/huawei_0.jpg"
width="96" height="48"></td>
<td><img src="https://upload.wikimedia.org/wikipedia/commons/thumb/f/fa/Apple_logo_black.svg/170px-Apple_logo_black.svg.png" width="96"
height="48"></td>
</tr>
</table>
</div>
<hr>
<table>ILX A-SPEC 4P L4 2.4L QC NAVI R18 AUT 5 OCUP</table>
<table>
<tr>
<td><button mat-button>
<mat-icon>check_box_outline_blank</mat-icon>
</button></td>
<td><button mat-button>
<mat-icon>check_box_outline_blank</mat-icon>
</button></td>
</tr>
</table>
<hr>
<table>ILX A-SPEC 4P L4 2.4L QC</table>
<table>
<tr>
<td><button mat-button>
<mat-icon>check_box_outline_blank</mat-icon>
</button></td>
<td><button mat-button>
<mat-icon>check_box_outline_blank</mat-icon>
</button></td>
</tr>
</table>
<hr>

Populating a table in meteor with items from collection

I already have some html code for an expandable/collapsible table that I am trying to put into a meteor application. code here
My main problem that I am having is that when I am populating the table in the meteor application, it is not creating a new expandable row for each new item in my collection (like the example above). Currently it is only populating one row with all the data from within the collection. (as seen in the picture below)
Here is my meteor code:
<template name="adminPage">
<div class="container">
<div class="col-md-12">
<div class="panel panel-default">
<div class="panel-heading">Students Waiting</div>
<div class="panel-body">
<table class="table table-condensed table-striped" id="outer-table">
<thead id="top-heading">
<tr>
<th></th>
<th >Name</th>
<th >Phone Number</th>
<th >VIP ID/USC ID</th>
<th >Current Status</th>
</tr>
</thead>
<tbody>
<tr data-toggle="collapse" data-target="#demo1" class="accordion-toggle">
<td>
{{> expandButton}}
</td>
<td>
{{> listName}}
</td>
<td>
{{> listNumber}}
</td>
<td>
{{> listVIP}}
</td>
<td> waiting</td>
</tr>
<tr>
<td colspan="12" class="hiddenRow">
<div class="accordian-body collapse" id="demo1">
<table class="table table-striped">
<thead id="innter-table">
<tr class="info">
<th id="inner-heading">Reason for Visit</th>
<th id="inner-heading">Current Major</th>
<th id="inner-heading">Intended Major</th>
<th id="inner-heading">Comments</th>
<th id="inner-heading"></th>
</tr>
</thead>
<tbody>
<tr>
<td>
{{> listReason}}
</td>
<td>
{{> listCurrent}}
</td>
<td>
{{> listIntended}}
</td>
<td>
{{> listComments}}
</td>
<td>
{{> listDisclaimer}}
</td>
</tr>
</tbody>
</table>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
<template name="expandButton">
<button class="btn btn-default btn-xs btn-circle">
<span id="plus" class="glyphicon glyphicon-plus"></span>
</button>
<template name="listName">
{{#each student_name}}
{{Name}}
<br>
{{/each}}
<template name="listNumber">
{{#each student_number}}
{{PhoneNumber}}
<br>
{{/each}}
<template name="listVIP">
{{#each student_ID}}
{{VipID}}
<br>
{{/each}}
<template name="listReason">
{{#each student_Reason}}
{{ReasonForVisit}}
<br>
{{/each}}
<template name="listCurrent">
{{#each student_Current}}
{{CurrentMajor}}
<br>
{{/each}}
<template name="listIntended">
{{#each student_Intended}}
{{IntendedMajor}}
<br>
{{/each}}
<template name="listComments">
{{#each student_Comments}}
{{Comments}}
<br>
{{/each}}
<template name="listDisclaimer">
{{#each student_Disclaimer}}
<button class="btn btn-default btn-sm" data-toggle="modal" data-target="#myModal" contenteditable="false">
<span class="glyphicon glyphicon-edit"></span>
</button>
<button class="btn btn-default btn-sm">
<span class="glyphicon glyphicon-trash"></span>
</button>
<br>
{{/each}}
So my main question is how do I go about getting the data from each item in the collection to populate in a new row so that each row is expandable with just the information from that one item?
Also how would I go about setting the data-target and id to a unique value for each item in the collection so that the row only expands for it's corresponding data?
For example:
<tr data-toggle="collapse" data-target="#demo1" class="accordian toggle">
and
<div class="accordian-body collapse" id="demo1">
using something like
<tr data-toggle="collapse" data-target="#(persons id number)" class="accordian toggle">
and
<div class="accordian-body collapse" id="(persons id number)">
Thanks!
You haven't structured your blaze in the right way. What you need to be doing is repeating each row of the table, with the appropriate data in it. Instead what you are doing is repeating each key within the table (which is only printing once).
It looks like you have made a lot of different helpers (student_name, student_number , student_ID, student_Reason, etc.) that each return a different set of student data?
What you want to do is create a single helper that returns the entire student object, then you can access the data within that object in the correct places. An example would be
<tbody>
{{#each student in students}}
<tr data-target="{{student._id}}">
<td>
{{student.name}}
</td>
<td>
{{student.reason}}
</td>
<td>
{{student.number}}
</td>
<td>
{{student.current}}
</td>
</tr>
{{/each}}
</tbody>
The code above is repeating the entire table row (<tr>) for each student object in the array of students that the helper is returning. You are then able to access any part of the student object by using dot notation. Using the structure above you should be able to solve the second half of your problem too.

Bootstrap 4 Table Issues

I'm currently making a template with Bootstrap 4. I have a table with four rows, here is the link to the said site: here.
Now with the CSS I have here for just the links:
a {
color: #F0FFFF;
}
a:visited {
color: #00FFFF;
}
a:hover {
text-decoration: none;
}
But at the fourth row, the fourth link does not follow the said CSS rules. My question is did I make a mistake on the CSS? Or does BootStrap 4 have a limit on Tables? With the BootStrap documentation, it shows examples of three rows only. Take a look here.
Here is the table HTML:
<table class="table table-striped table-inverse">
<thead>
<tr>
<th>Date</th>
<th>Area</th>
<th>Venue</th>
<th>Tickets</th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">June 16, 2017</th>
<td>Auburn Hills, MI</td>
<td>Palace Of Auburn Hills</td>
<td><a href="#">
<button type="button" class="btn btn-primary btn-sm" data-toggle="button" aria-pressed="false" autocomplete="off">
Tickets!!
</button></a>
</td>
</tr>
<tr>
<th scope="row">June 19, 2017</th>
<td>Los Angeles, CA</td>
<td>Los Angeles Memorial Coliseum </td>
<td><button type="button" class="btn btn-primary btn-sm" data-toggle="button" aria-pressed="false" autocomplete="off">
Tickets!!
</button></a>
</td>
</tr>
<tr>
<th scope="row">June 23, 2017</th>
<td>Toyko, Japan</td>
<td>Nippon Budokan</td>
<td><button type="button" class="btn btn-primary btn-sm" data-toggle="button" aria-pressed="false" autocomplete="off">
Tickets!!
</button></a>
</td>
</tr>
<tr>
<th scope="row">June 26, 2017</th>
<td>Hong Kong</td>
<td>Hong Kong Festival</td>
<td><button type="button" class="btn btn-primary btn-sm" data-toggle="button" aria-pressed="false" autocomplete="off">
Hey!
</button></a>
</td>
</tr>
</tbody>
</table>

angular ngif button on table

I am trying to make table in which there are two show/hide buttons for two columns say A and B.. button a and b separately are functioning properly but If i use both in table ... only one of them functions properly other doesn't do anything.. pls hlp me i am new to this
<table datatable="ng" class="row-border hover table table-condensed no-margin">
<thead>
<tr>
<th>#</th>
<th>Username</th>>
<th>Profile</th>
<th>Points</th>
<th>Forcasts Won/Lost</th>
<th>Invites</th>
<th>Referrals</th>
<th>Activity</th>
<th>Most Used Redeemption Gateway</th>
<th>Most Read FAQ</th>
<th>Promo Codes used</th>
<th>Suspend/Unsuspend</th>
</tr>
</thead>
<tbody>
<tr ng-repeat-start="person in showCase.persons">
<td>{{person.id}}</td>
<td>{{person.uname}}</td>
<td>
<button type="button" class="btn btn-primary" ng-if="person.Profexpanded" ng-click="person.Profexpanded = false;person.Invexpanded=false">Hide</button>
<button type="button" class="btn btn-primary" ng-if="!person.Profexpanded" ng-click="person.Profexpanded = true;person.Invexpanded=false">Show</button>
</td>
<td>{{person.points}}</td>
<td>{{person.forcasts}}</td>
<td style="padding:5px">
<table><tbody>
<tr><td><b>sent: </b></td> <td>{{person.invites[0].sent}}</td></tr>
<tr><td><b>accepted:</b></td> <td>{{person.invites[0].accepted}}</td></tr>
</tbody></table>
</td>
<td>{{person.referrals}}</td>
<td>
<button type="button" class="btn btn-primary" ng-if="person.Invexpanded" ng-click="person.Invexpanded = false;person.Profexpanded = false">Hide</button>
<button type="button" class="btn btn-primary" ng-if="!person.Invexpanded" ng-click="person.Invexpanded = true;person.Profexpanded = false">Show</button>
</td>
<td>{{person.muredempt}}</td>
<td>{{person.mfaq}}</td>
<td>{{person.promocodes}}</td>
<td>{{person.isSuspended}}</td>
</tr>
<tr ng-if="person.Profexpanded" ng-repeat-end="">
<td class = "profile" colspan="5">
Hello A
</td>
</tr>
<tr ng-if="person.Invexpanded" ng-repeat-end="">
<td>Hello B</td>
</tr>
</tbody>
</table>
<!--end .card-body -->
</div>`
Maybe try ng-show instead ng-if <tr ng-show="person.Invexpanded" ng-repeat-end="">
Use
<tr ng-if="person.Profexpanded">
instead of
<tr ng-if="person.Profexpanded" ng-repeat-end="">

How to make HTML elements in one row?

I have this HTML rows:
<table class="table table-responsive table-hover">
<thead>
<tr>
<th>Type Object</th>
<th style="width: 100px;text-align: left">
<a class="btn btn-primary btn-sm">
<i class="glyphicon glyphicon-plus"></i>
</a>
</th>
</tr>
</thead>
<tbody ng-repeat="object in objects track by object.Id">
<tr>
<td ng-bind="object.Name"></td>
<td>
<a class="btn btn-default btn-xs" ng-click="object.showPhoto = !object.showPhoto; $event.stopPropagation();"><i class="glyphicon glyphicon-camera"></i></a>
<a class="btn btn-default btn-xs" ui-sref="objects.view({regionId:region.Id, objectId:object.Id})" ng-click="$event.stopPropagation();"><i class="glyphicon glyphicon-info-sign"></i></a>
<a class="btn btn-default btn-xs" ng-click="zoomObject(object); $event.stopPropagation();"><i class="glyphicon glyphicon-screenshot"></i></a>
<a class="btn btn-default btn-xs" ng-click="object.showReview = object.showReview;"><i class="glyphicon glyphicon-list-alt"></i></a>
</td>
</tr>
<tr ng-if="object.showPhoto">
<td colspan="2"><img ng-src="{{getPhotoUrl(object)}}" style="max-width: 100%;" alt="Image Object" /></td>
</tr>
<tr ng-if="object.showReview">
<td colspan="2">nnn!!!</td>
<list-of-insp></list-of-insp>
</tr>
</tbody>
</table>
Here how it's looks in view:
My question is how can I make all elements to be in one row?
<th style="width: 100px;text-align: left">
Change it to something like 200px.
Second thing - your table is not responsive, in Bootstrap you have to create another div above the table with class table-responsive.
Float each element left and wrap them in an element/div with a minimum width of at least the size of all 4 elements